Зачем использовать boost :: ice_or вместо ||и повысить :: ice_and вместо && в enable_if? - PullRequest
5 голосов
/ 23 марта 2011

Как показывает вопрос, есть ли причина, по которой люди используют версию struct вместо обычных условных выражений?

1 Ответ

9 голосов
/ 23 марта 2011

Выдержка из Руководства по ускоренному кодированию для интегральных выражений констант :

Не используйте логические операторы в целочисленных константных выражениях; вместо этого используйте шаблонное метапрограммирование.

Заголовок содержит несколько шаблонов обходных путей, которые выполняют роль логических операторов, например вместо:

INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2

Использование:

::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value

Обоснование: Ряд компиляторов (в частности, компиляторы Borland и Microsoft), как правило, не распознают интегральные константные выражения, включающие логические операторы, как подлинные интегральные константные выражения. Проблема обычно проявляется только тогда, когда интегральное константное выражение глубоко вложено в код шаблона и его трудно воспроизвести и диагностировать.

Так что я бы никогда не сказал о совместимом компиляторе. (Но если вам нужно поддерживать несовместимые компиляторы, используйте его.)

...