Обратите внимание на следующий код. Это шаблон функции, который работает с типом T
в зависимости от его ширины бита. Фактический код более сложный, но это не имеет значения:Исключить часть шаблона функции во время компиляции
template <typename T> T MyFunc(T t)
{
constexpr const uint8_t typeBitCount = sizeof(T)*8;
// more code here that works fine for all widths
if (typeBitCount >= 32)
{
if (...)
{
return t >> 16; // warning right shift count >= width of type
}
if (typeBitCount >= 64)
{
if (...)
{
return t >> 32; // warning right shift count >= width of type
}
}
}
}
Я использую это также с 8-разрядными типами. В этом случае я получаю предупреждения (см. Прокомментированные строки). К сожалению, C++ не может оценить состояние if
во время компиляции даже при использовании constexpr
. Возможно, я мог бы подавить предупреждения, но это кажется мне взломанным. Я бы предпочел исключить проблемный код во время компиляции.
Как это можно решить (возможно, без нарушения кода на куски и без создания избыточности)?
Я использую GCC 5.4.0.
Весь код должен быть скомпилирован. Выбор в зависимости от 'typeBitCount' происходит только во время выполнения, а не во время компиляции. Поэтому вы получаете предупреждения, когда компилятор приходит к этим строкам. –
Это совершенно ясно. Вопрос в том, как решить эту проблему как можно чище. – Silicomancer
Если у вас есть компилятор C++ 14, вы можете сделать всю функцию функцией 'constexpr' и оценить ее время компиляции (в зависимости от части« больше кода здесь ... »). Это может решить некоторые из ваших проблем. Или вы можете специализировать функцию для 8-битных типов и поместить общую часть «больше кода здесь ...» в отдельную функцию. –