变量模板扩展,继承和std :: unique_ptr

时间:2017-04-21 00:53:29

标签: c++ c++11 c++14 variadic-templates 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;

我想使用std::unique_ptrstd::make_unique来避免明确调用new并迭代v_以在析构函数中删除它v_将成为std::vector<std::unique_ptr<A>>),但无法弄清楚如何将std::make_unique与初始化列表和可变扩展结合起来(我怀疑由于std::unique_ptr只是移动)。有什么建议?

1 个答案:

答案 0 :(得分:3)

如下所示的C构造函数呢?

   // 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中的初始unused(来自aschepler的建议(谢谢!))允许定义

C<> etl; 

包含C的空类型列表。