Мне нужно замаскировать некоторые ведущие биты значения. Если значение без знака, я могу утверждать (гарантировать), что какое-то произвольное число ведущих битов не задано, то есть гарантированно ограниченное значение.Тестирование подписи параметра шаблона
Если он подписан, мне нужно замаскировать ведущие биты (превращение значения в некоторую непереносимую кучу бит, да, я знаю об этом :-)). Я хотел бы сохранить операцию маскировки, если значение не указано.
Так что я в основном имею
template<typename T, some more template parameters>
class {
unsigned transform(T value) {
...
if (isSigned(T)) {
value &= mask;
}
...
}
}
Есть простой способ, чтобы написать isSigned(), которая может быть оценена во время компиляции (для того, чтобы оптимизатор удалить неподписанный мертвый код)?
Конечно, я мог бы добавить еще один параметр шаблона ...
Собственно, компилятор полностью способен оптимизировать мертвый код. Но это может вызвать предупреждение ... –
@ KonradRudolph: Это деталь. OP может захотеть написать код, который имеет смысл только в одном из двух случаев, и оператор 'if' требует, чтобы вы указали правильный код, даже если он никогда не используется. Шаблоны не имеют этого ограничения. –
Спасибо, я поеду за этим. Главное, чего не хватало: 'std :: is_signed' (или 'numeric_limits :: is_signed' или даже' T (-1)
hirschhornsalz