我的代码是这样的:
#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_ptr
和std::make_unique
来避免明确调用new
并迭代v_
以在析构函数中删除它v_
将成为std::vector<std::unique_ptr<A>>
),但无法弄清楚如何将std::make_unique
与初始化列表和可变扩展结合起来(我怀疑由于std::unique_ptr
只是移动)。有什么建议?
答案 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
的空类型列表。