【发布时间】:2016-04-29 08:18:49
【问题描述】:
我正在创建一个可变参数模板。
假设我有这样的事情:
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 或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 中不可行的话)编译的东西。
【问题讨论】:
-
在 C++17 中:
static_assert(((Numbers == 0 || Numbers == 1) && ... && true));(Demo) -
我认为
BOOST_PP_COMMA_IF和BOOST_PP_SEQ_FOR_EACH_I可以在使用 boost 的情况下解决问题。 -
@KerrekSB
&& true也是可选的。
标签: c++ c++11 variadic-templates static-assert