私はvariadicテンプレートを作成しています。このクラスのvariadicテンプレートのパラメータパックの値をstatic_assertするにはどうすればよいですか?
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++ 11で実行できない場合はC++ 14コンパイラ)でコンパイルするものを使用したいと考えています。
C++では、静的なアサート(((Numbers == 0 || Numbers == 1)&& ... ... && true)); '([Demo](http://melpon.org/wandbox/) permlink/IbYXFUPVkK3RM35P)) –
ブーストを使用している場合は、 'BOOST_PP_COMMA_IF'と' BOOST_PP_SEQ_FOR_EACH_I'がそのトリックを行うことができると思います。 –
@KerrekSB '&& true'もオプションです。 –