我希望实现一个模板函数,用于在编译时为整数类型生成位掩码。这些掩码应基于8位模式,其中该模式将连续重复以填充整数。以下示例完全符合我的要求,但是在运行时执行:
上述代码的输出为:
#include <iostream>
#include <type_traits>
#include <cstring>
template<typename Int>
typename std::enable_if<std::is_integral<Int>::value, Int>::type
make_mask(unsigned char pattern) {
Int output {};
std::memset(&output, pattern, sizeof(Int));
return output;
}
int main() {
auto mask = make_mask<unsigned long>(0xf0);
std::cout << "Bitmask: '" << std::hex << mask << "'" << std::endl;
}
上述代码的输出为:
Bitmask: 'f0f0f0f0f0f0f0f0'
我知道优化器可以消除上面代码中的整个函数调用,但我正在寻找一个使用c++14(可选使用c++11)的constexpr
解决方案。
C++98
。我认为byte_repeater
不是必需的,它在主模板中的count
参数可以初始化为count = sizeof(Int)
,然后如果count
是最后一个参数,就可以像make_mask
一样使用byte_repeater
。尽管如此,将count
参数隐藏在单独的模板中是个好主意,因为这只是一个实现细节。 - Akira