2017-06-12 2 views
3

C++ 17 führt "constexpr if" ein, das abhängig von einer Kompilierungszeit instanziiert wird.Ist "constexpr if" besser als switch statement?

Bedeutet es, dass es besser ist, "constexpr if" in Template-Funktionen zu verwenden als switch statement?

Zum Beispiel:

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

Sie müssen definieren, was Sie mit "besser" meinen. Effizienter? Das hängt von der Compilerimplementierung ab. Einfacher zu lesen? Ich bevorzuge die switch-Anweisung, aber das ist meine subjektive Meinung. – Ferruccio

+0

Switch ist einfacher zu lesen, wenn jeder Fall eine einfache Ganzzahl oder Aufzählung ist, und Sie erhalten doppelte Überprüfung kostenlos. –

Antwort

6

if constexpr eingeführt wurde, bestimmte Zweige zu eliminieren, die schlecht ausgebildet sind, wenn die Bedingung falsch ist. In Ihrem Fall führen Sie nur einige Operationen an einem int durch, also sollte kein Zweig schlecht gebildet sein, wenn ein anderer wohlgeformt ist. Es macht keinen Sinn, es zu benutzen.

Wie oben erwähnt, bietet die Verwendung von if constexpr keine echten Vorteile neben der Garantie, dass der Compiler alle anderen Zweige entfernt. Aber ich erwarte einen guten Compiler mit Optimierungen, um das auch mit switch zu tun, da val eine Konstante ist, wenn func instanziiert wird.

Ich würde die switch Aussage verwenden, aber das bin nur ich. Also, wähle den, den du magst.