我正在创建一个可变参数模板。
假设我有这样的东西:
template<typename T, T ... Numbers>
class Sequence final {
// Unpack parameter pack into a constexpr array
constexpr static T count = sizeof...(Numbers);
constexpr static T numbers[count] = { Numbers... };
// ...
}
此类的实例可以如下实例化:
Sequence<uint32_t, 1, 2, 3, 42, 25> seq;
我想确保在编译时使用static_assert
认为numbers
参数包仅包含特定数字。为了这个例子,假设我只想允许0
or 1
.
所以我想做一些类似的事情:
for (size_t i = 0; i < count; i++) {
static_assert(numbers[i] == 1 || numbers[i] == 0, "Only ones and zeroes are allowed.");
}
但显然,static_assert
不适用于for
环形。我很确定一定有某种语法,但我一直无法弄清楚。
我更喜欢使用 C++11 编译器(或者 C++14 编译器,如果它在 C++11 中不可行)编译的东西。
我会投入@科伦坡的bool_pack trick https://stackoverflow.com/questions/28253399/check-traits-for-all-variadic-template-arguments/28253503#28253503.
template<bool...> struct bool_pack;
template<bool... bs>
using all_true = std::is_same<bool_pack<bs..., true>, bool_pack<true, bs...>>;
static_assert(all_true<(Numbers == 0 || Numbers == 1)...>::value, "");
将表达式提取为constexpr
如果它变得复杂的话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)