Как показывает вопрос, есть ли причина, по которой люди используют версию struct вместо обычных условных выражений?
Выдержка из Руководства по ускоренному кодированию для интегральных выражений констант :
Не используйте логические операторы в целочисленных константных выражениях; вместо этого используйте шаблонное метапрограммирование. Заголовок содержит несколько шаблонов обходных путей, которые выполняют роль логических операторов, например вместо: INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2 Использование: ::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value Обоснование: Ряд компиляторов (в частности, компиляторы Borland и Microsoft), как правило, не распознают интегральные константные выражения, включающие логические операторы, как подлинные интегральные константные выражения. Проблема обычно проявляется только тогда, когда интегральное константное выражение глубоко вложено в код шаблона и его трудно воспроизвести и диагностировать.
Не используйте логические операторы в целочисленных константных выражениях; вместо этого используйте шаблонное метапрограммирование.
Заголовок содержит несколько шаблонов обходных путей, которые выполняют роль логических операторов, например вместо:
INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2
Использование:
::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value
Обоснование: Ряд компиляторов (в частности, компиляторы Borland и Microsoft), как правило, не распознают интегральные константные выражения, включающие логические операторы, как подлинные интегральные константные выражения. Проблема обычно проявляется только тогда, когда интегральное константное выражение глубоко вложено в код шаблона и его трудно воспроизвести и диагностировать.
Так что я бы никогда не сказал о совместимом компиляторе. (Но если вам нужно поддерживать несовместимые компиляторы, используйте его.)