我想要一个在编译时生成的多态类型数组。对数组的访问是在运行时决定的(否则我只会使用一个元组)。我希望数组通过 unique_ptr 拥有它的元素。目前我正在使用可变参数模板来创建数组。我正在尝试做的简化版本(MSVC 2012 年 11 月 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 数组。我仍在尝试围绕可变参数模板进行思考。