2016-07-28 11 views
5

たとえば、私は次のC++クラスを持っている:C++オブジェクトのインスタンス化の配列(Iは、コンパイル時の解決策を見つけようとしている)

struct A { 
    A(const int value) {} 
}; 

私は、単一のオブジェクトをしたい場合は、私はこれを行うことができます:

A a = A(3); 

これらのオブジェクトのうち10個を作成したいと思いますが、静的にインスタンス化する方法がわかりません。

A a[10]; // This won't compile, as struct A constructor needs an argument 

私はポインタA *aを使用して、1でオブジェクトを作成し、私は静的に1回のショットでこれらを行うことができますことができます利用可能C++11の新機能があるかどうかはわからないですか?

答えて

7

リストの初期化は、あなたが

A a[10]{0,1,2,3,4,5,6,7,8,9}; 

Aのコンストラクタに渡されるリストの各要素を記述することができます。

あなたが Aのすべてのインスタンスに対して同じパラメータを使用する場合は、以下のいずれかのようサポート機能を使用することができます

Live demo

-1

#include <array> 
#include <cstddef> 
#include <functional> 
#include <cassert> 

struct A { 
    A(int value): v{value} { } 

    template<std::size_t... I> 
    static A* create(std::index_sequence<I...>, int val) { 
     return new A[sizeof...(I)]{ (I, val)... }; 
    } 

    template<std::size_t N> 
    static A* create(int val) { 
     return create(std::make_index_sequence<N>(), val); 
    } 

    int v; 
}; 

int main() { 
    A *arr = A::create<10>(42); 
    for(int i = 0; i < 10; i++) assert(arr[i].v == 42); 
    delete[] arr; 
} 

基本的な考え方は、それが作成させることですNという新しい配列をAとし、構築中にすべて同じパラメーターvalを使用します。

NOTE

std::make_index_sequencestd::index_sequenceはリビジョンC++ 14以降のゲームの一部です。あなたがそれらを使用できない場合は、オンラインで上記のコードとほぼ同じコードを使用するのに役立つC++ 11の実装を見つけることができます:

+0

@downvotersこれは最小の実用的な解決策です。感謝。それはあなたの視点から何が間違っているかを少なくとも理解するのに役立ちます...ありがとう。 – skypjack

関連する問題