2017-04-21 18 views
3

私はこのように動作するコードを持っている:可変個引数テンプレート展開、相続、とstd :: unique_ptrを

#include <memory> 
#include <vector> 

using namespace std; 

struct A { 
    virtual ~A() = default; 
}; 

struct B : public A { 
}; 

template<typename... Ts> struct C { 
    C() : v_({new Ts...}) {} 

    ... 

    std::vector<A*> v_; 
}; 

... 

C<B, B, A> bba; 

私は明示的にnewを呼び出し、それを削除するv_を反復を避けるためにstd::unique_ptrstd::make_uniqueを使用したいですデストラクタ(v_は)になりますが、std::make_uniqueと初期化リストと可変長の拡張を結びつける方法はわかりません(私はstd::unique_ptrが移動専用であると思われます)。助言がありますか?

+0

これはなぜ変わったのですか?しかし、 'std :: vector >と' std :: tuple >コレクションがコンテンツ署名を変更すると予想される場合、コンストラクタはクラスではなくテンプレートである必要があります。 – TBBle

答えて

3

C次のようなコンストラクタはどうですか? unused

// C++11 version (std::make_unique() unavailable in C++11) 
    C() 
    { 
     using unused = int[]; 

     v_.reserve(sizeof...(Ts)); 

     (void)unused { 0, (v_.emplace_back(new Ts), 0)... }; 
    } 

    // C++14 version 
    C() 
    { 
     using unused = int[]; 

     v_.reserve(sizeof...(Ts)); 

     (void)unused { 0, (v_.emplace_back(std::make_unique<Ts>()), 0)... }; 
    } 

初期0(ascheplerからの提案(感謝!))Cための空のタイプリストで

C<> etl; 

の定義を許可します。

+0

'C <>'が動作するように、 'u'に余分な0を追加します。 C++ 11で "C++ 14バージョン"を使用できないのはなぜですか? – aschepler

+0

@aschepler - 良いアイデア余分な0、私はそれを使用します。 2番目の解決策は、(私が正しく記憶しているならば) 'std :: make_unique()'がC++ 14の機能であるからです。 – max66

関連する問題