switch_value

以下、cppll に投稿したネタと同文。

以下は、switch の引数(?)を switch ブロック内で再利用する為の
ギミックです。

■定義
  #if !defined(switch_value)
  class switch_ex_core_type
  {
    public:
      int value;
      switch_ex_core_type(int a_value) :value(a_value) { }
      operator bool () const { return false; }
  };
  #define switch_ex(X) \
      if (switch_ex_core_type switch_ex_core_value = (X)); \
      else switch(switch_value)
  #define switch_value (switch_ex_core_value.value)
  #endif

■用例
  switch_ex(get_number())
  {
    case 0:
      printf("zero\n");
      break;
    case 1:
      printf("one\n");
      break;
    default:
      printf("%d\n", switch_value);
      break;
  }

...極力、変数(一時変数を除く)を減らすことを心がけてる自分みたいな
コーディングスタイルだと、よくこーゆー類のモノが欲しくなりますです。

# このギミックでは本質的には変数を減らしていることにはならないわけ
# ですが、自分的には変数を減らすことの理由の一つである「命名の機会
# を少しでも減らす」ということは果たせているんでおk。

# マクロベースなのが少々いただけませんが。

# 後、あまりオススメはしませんが、邪悪なコードに抵抗の無い方は
# switch_ex の名前を switch に代えて全ての switch 構文に適用して
# 遊んでみてください。

http://www.freeml.com/message/cppll@freeml.com/0012782
http://www.tietew.jp/cppll/archive/12782