variadic模板扩展,继承和std :: unique_ptr

Variadic template expansion, inheritance, and std::unique_ptr

本文关键字:std unique ptr 继承 扩展 variadic      更新时间:2023-10-16

我的代码是这样的:

#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与初始化列表和Variadic扩展(我怀疑std::unique_ptr仅移动(。有什么建议么?

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 )... };
    }

unused中的初始0(来自Aschepler的建议(谢谢!((允许定义

C<> etl; 

使用C的空类型列表。