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