Зачем использовать boost :: ice_or вместо ||и boost :: ice_and вместо && в enable_if?

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

Вопрос

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

Это было полезно?

Решение

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

<цитата>

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

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

<цитата>

INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2

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

<цитата>

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top