2017-06-12 11 views
3

C++ 17では、コンパイル時の条件によってインスタンス化される「constexpr if」が導入されています。"constexpr if"はswitch文よりも優れていますか?

switch文ではなくテンプレート関数で "constexpr if"を使用する方が良いということですか?例えば

template<int val> void func() 
{ 
    if constexpr(val == 0) {} else 
    if constexpr(val == 1) {} else 
    ... 
    if constexpr(val == k) {} else {} 
} 
// vs 
template<int val> void func() 
{ 
    switch (val) 
    { 
     case 0: 
      break; 
     case 1: 
      break; 
     ... 
     case k: 
      break; 
     default: 
      break; 
    } 
} 
+6

"より良い"という意味を定義する必要があります。もっと効率的?これはコンパイラの実装に依存します。読みやすい? switch文が好きですが、それは私の主観的意見です。 – Ferruccio

+0

各ケースが単純な整数または列挙型であれば、スイッチは読みやすく、自由に重複してチェックを受けます。 –

答えて

6

if constexpr条件が偽であれば病気に形成されている特定の枝を除去するために導入されました。あなたのケースでは、intで何らかの操作しか行っていないので、別のものが正常に形成されていれば、不正な形になることはありません。それは本当にそれを使用する意味がありません。

上記のように、if constexprを使用すると、コンパイラが他のすべてのブランチを削除することを保証するだけでなく、実際の利点はありません。しかし、funcがインスタンス化されたときにはvalが定数であるため、switchで最適化を行う良いコンパイラもこれを行うと期待しています。

私はswitchステートメントを使用しますが、それは私だけです。だから、好きなものを選んでください。

関連する問題