Warum Boost :: ice_or anstelle von || verwenden?und boost :: ice_and anstelle von && in enable_if?
-
28-10-2019 - |
Frage
Wie die Frage besagt, gibt es einen Grund, warum Benutzer die Strukturversion über die normalen Bedingungen verwenden?
Lösung
Ein Auszug aus den Boost-Codierungsrichtlinien für integrale konstante Ausdrücke :
Verwenden Sie keine logischen Operatoren in integralen konstanten Ausdrücken. Verwenden Sie stattdessen die Vorlagen-Metaprogrammierung.
Der Header enthält eine Reihe von Problemumgehungsvorlagen, die die Rolle logischer Operatoren erfüllen, z. B. anstelle von:
INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2
Verwenden Sie:
::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value
Begründung: Eine Reihe von Compilern (insbesondere die Borland- und Microsoft-Compiler) neigen dazu, integrale konstante Ausdrücke, an denen logische Operatoren beteiligt sind, nicht als echte integrale konstante Ausdrücke zu erkennen. Das Problem tritt im Allgemeinen nur auf, wenn der integrale konstante Ausdruck tief im Vorlagencode verschachtelt ist und schwer zu reproduzieren und zu diagnostizieren ist.
Also würde ich sagen, niemals auf einem kompatiblen Compiler. (Wenn Sie jedoch nicht kompatible Compiler unterstützen müssen, verwenden Sie diese.)