0

我想要一个在编译时生成的多态类型数组。对数组的访问是在运行时决定的(否则我只会使用一个元组)。我希望数组通过 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 数组。我仍在尝试围绕可变参数模板进行思考。

4

2 回答 2

0

你想做的基本上是有效的:

std::array<unique_ptr<foo>, tuple_size<t>::value> l = { unique_ptr<args>(new args())... };

将编译(即使在 MSVC 上!),因为您正在从临时构建并且将调用移动构造函数(如果不是,添加std::move将修复它)。

您接下来尝试做的事情不会:

return l;

因为您试图按值返回不可复制的 unique_ptrs 数组。

于 2013-01-02T06:50:13.830 回答
0

RHS 需要用unique_ptrs 初始化吗?sunique_ptr构造函数不能用吗?你试过吗

std::array<unique_ptr<foo>, tuple_size<t>::value> l = { new args()... }; 
于 2013-01-02T06:10:24.633 回答