【发布时间】:2015-10-23 11:44:08
【问题描述】:
我正在尝试制作一个小型元编程结构,该结构生成width 位掩码向左移动shift 位置(主要用于学习目的)。以下代码在 VC++15 上为mask<64>::value; 触发警告 C4293(移位计数为负或太大,未定义的行为),因为它仍会触发三元运算符的第二个分支 - 即使它不应该影响值本身。有什么更好、更清洁的方法来实现这一目标?
// Bitmask of 'width' bits shifted 'shift' bits to the left
// For instance, mask<16,8> := 0x00FFFF00
template <uint8_t width, uint8_t shift=0>
struct mask {
static const uintmax_t value = (width >= (sizeof(uintmax_t)<<3)) ?
(~0 << shift) : (((uintmax_t(1)<<width)-1) << shift) ;
mask()=delete;
};
// A bitmask for a type, for instance, 0xFF for uint8_t
template <class T>
struct typeMask {
static const uintmax_t value = mask<sizeof(T)<<3>::value;
typeMask()=delete;
};
【问题讨论】:
-
实际的错误信息是比“C4293”更有用的信息。很少有人能记住 VC++ 的错误代码。
-
哎呀,本来想放的,最后忘记了。固定的!谢谢!
标签: c++ c++11 metaprogramming