2

std::arrayいくつかの Foo 要素を作成する簡単な例があります。

struct Foo
{
     Foo(int bar=0) : m_bar(bar) 
     {
       // Code depending on the value of bar
     }

     int m_bar;
};

const unsigned int num = // get array size 
std::array<Foo, num> fooArr;

コンストラクターで初期化リストを使用すると、m_bar(bar)すべてがFoo.m_bar0設定されます (これはデフォルトのコンストラクターパラメーター値であるため)。そうしないと、ガベージ値でいっぱいになります。

私の質問は、配列サイズを事前に知らなくても、デフォルト値とは異なる別の値を配列内のすべての要素のコンストラクターに渡すにはどうすればよいですか?

次のように、配列を作成するときに初期化リストを使用しようとしましたが、それは最初の要素を にstd::array<Foo, 5> fooArr{3}設定するだけです。m_bar3

4

2 に答える 2

4

Ninteger_sequence個の要素を持つ を作成し、パック展開で配列を構築します。これは、デフォルトのコンストラクターが重要な作業を行うか、存在しない場合に便利です。

template<std::size_t N, class T, std::size_t... Ns>
std::array<T, N> make_repeating_array(const T& value, std::index_sequence<Ns...>) {
    return {(void(Ns), value)... };
}

template<std::size_t N, class T>
std::array<T, N> make_repeating_array(const T& value) {
    return make_repeating_array<N>(value, std::make_index_sequence<N>());
}

使用

std::array<Foo, num> fooArr = make_repeating_array<num>(Foo(5));
于 2015-09-17T09:51:24.447 に答える