请考虑下面的代码。它是一个功能模板,根据其位宽,根据类型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位类型。在这种情况下,我会收到警告(请参阅注释行)。不幸的是,即使使用constexpr
,C++也无法在编译期间评估if
条件。我大概可以压制这些警告,但这对我来说似乎很难受。我宁愿在编译时排除有问题的代码。
如何解决这个问题(可能不会破坏代码并且不会造成冗余)?
我正在使用GCC 5.4.0。
所有的代码都需要编译。取决于'typeBitCount'的选择只发生在运行时,而不是编译时。因此,当编译器进入这些行时,您会收到警告。 –
这完全清楚。问题是如何解决这个尽可能干净。 – Silicomancer
如果你有一个C++ 14编译器,你可能可以使整个函数成为一个'constexpr'函数,并让它评估一个编译时间(取决于“更多代码在这里......”部分)。这可能会解决你的一些问题。或者你可以专门为8位类型的函数,并将通用的“更多代码在这里......”部分放在一个单独的函数中。 –