Warum Boost :: ice_or anstelle von || verwenden?und boost :: ice_and anstelle von && in enable_if?

StackOverflow https://stackoverflow.com/questions/5400385

Frage

Wie die Frage besagt, gibt es einen Grund, warum Benutzer die Strukturversion über die normalen Bedingungen verwenden?

War es hilfreich?

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.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top