コンパイル時に生成されるポリモーフィック型の配列が必要です。配列へのアクセスは実行時に指示されます (それ以外の場合はタプルを使用します)。配列がunique_ptrを介してその要素を所有することを望みます。現在、可変個引数テンプレートを使用して配列を作成しています。私がやろうとしていることの簡略化されたバージョン (MSVC 2012 November CTP):
#include "stdafx.h"
#include <array>
#include <memory>
#include <tuple>
#include <initializer_list>
#include <iostream>
using namespace std;
class foo { };
class bar : public foo { };
class wiz : public foo { };
struct house
{
template<class... args>
struct furniture
{
typedef tuple<args...> t;
static std::array<unique_ptr<foo>, tuple_size<t>::value> make()
{
std::array<unique_ptr<foo>, tuple_size<t>::value> l = { unique_ptr<args>(new args())... };
return l;
}
};
typedef furniture<bar, wiz> td;
};
int _tmain(int argc, _TCHAR* argv[])
{
auto result = house::td::make();
return 0;
}
残念ながら、次のコンパイラ エラーが表示されます。
error C2248: 'std::unique_ptr<foo,std::default_delete<_Ty>>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<foo,std::default_delete<_Ty>>'
これは、イニシャライザ リストはコピーを通じて機能しますが、unique_ptr はコピーできないためです。これは、必要な動作を提供する shared_ptr (または生のポインター) を使用して回避できますが、このように unique_ptr の配列を作成する方法があるかどうかに興味があります。私はまだ可変個引数テンプレートに頭を悩ませようとしています。