我目前有一个模板函数,根据其模板参数 A 和 B,可以向左或向右移动值:
template <int A, int B> void f(X) {
// ...
if (A >= B)
{
SetValue(X << (A-B));
}
else // (A < B)
{
SetValue(X >> (B-A));
}
当我实例化模板时A<B
,我收到关于(无法到达的)第一个分支右移负移的警告,否则我收到关于第一个分支左移负移的警告。我们的代码库没有警告,因此这是不可接受的。是否有一个简洁、可读的替代方案来替代这两个 shift 语句?
类似的问题(例如动态左移或右移 https://stackoverflow.com/questions/8009040/dynamically-shift-left-or-right)没有这个虚假警告,因为移位距离是一个运行时变量。
使用 C++11 或 boost。
template<int A, int B>
void f_impl(typename std::enable_if<(A >= B)>::type* = 0)
{
// first case
}
template<int A, int B>
void f_impl(typename std::enable_if<(A < B)>::type* = 0)
{
// second case
}
template<int A, int B>
void f()
{
f_impl<A, B>();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)