可変個引数テンプレートを使用してコンストラクターを試すことができます。
template<std::size_t N, typename E>
struct MyStruct {
int otherStuff;
E values[N];
template<typename ...TT>
MyStruct(TT&&...t) : values{std::forward<TT>(t)...} {
static_assert(N == sizeof...(t), "Size mismatch!");
for (size_t i = 0; i < N; i++) std::cout << values[i] << ",";
std::cout << std::endl;
}
};
これは、次の場合に期待どおりに機能します。
MyStruct<3, int> example = {1,2,3};
MyStruct<3, int> exampleFail = {1,2}; //error: static assertion failed: Size mismatch!
リストの初期化に関しては、 と の間std:array
にはまだ違いがあることに注意してください。MyStruct
MyStruct<3, int> exampleList{1,2,3}; // works
std::array<int, 3> arr = {1,2,3}; // works, but warning with clang++
std::array<int, 3> arrList{1,2,3}; // works with g++, does not compile with clang++
その理由は、公式の欠陥レポートで文書化されているように、ブレースの省略が常に適用されるとは限らないため、単一のブレースは std::array に対してのみ機能するためです。