2024/05/14
配列の要素は{}
で初期化することができる。
class MyClass
{
MyClass() : array_{0, 1, 2, 3} {}
int array_[4];
};
これを変更して、任意の配列サイズに対応する方法を考えてみる。基本的な考え方は以下の通りで、テンプレート引数をそのまま配列に渡せればよい。
template <size_t... iota>
MyClass(???) : array_{iota...} {}
そしてこの ??? にはstd::index_sequence
を使うことができる。
template <size_t... iota>
MyClass(std::index_sequence<iota...>) : array_{iota...} {}
また、std::make_index_sequence<4>{}
とすればindex_sequence<0, 1, 2, 3>
を作ることができる。配列サイズはstd::extent
で取得できるので、まとめると以下のようになる。
class MyClass
{
MyClass() : MyClass{std::make_index_sequence<std::extent_v<decltype(array_)>>{}} {}
template <size_t... iota>
MyClass(std::index_sequence<iota...>) : array_{iota...} {}
int array_[4];
};
ちなみに配列を全て同じ値で初期化したい場合は、(iota, x)
とすればよい。
template <size_t... iota>
MyClass(std::index_sequence<iota...>) : array_{(iota, 777)...} {}