我想在编译时生成一组多态类型。在运行时指定对数组的访问(否则我将使用元组)。我希望数组通过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数组。我仍然试图围绕可变参数模板。
答案 0 :(得分:0)
RHS是否需要使用unique_ptr
进行初始化?不能使用unique_ptr
的构造函数吗?你试过吗
std::array<unique_ptr<foo>, tuple_size<t>::value> l = { new args()... };
答案 1 :(得分:0)
您想要做的事情基本上有效:
std::array<unique_ptr<foo>, tuple_size<t>::value> l = { unique_ptr<args>(new args())... };
将编译(甚至在MSVC上!),因为你正在构建temporaries并且将调用move构造函数(如果不是,则添加std::move
将修复它)。
您接下来要做的事情不是:
return l;
因为你试图按值返回不可复制的unique_ptrs数组。