可变参数模板扩展、继承和 std::unique_ptr
Variadic template expansion, inheritance, and std::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_ptr
和 std::make_unique
来避免显式调用 new
并迭代 v_
以在析构函数中删除它 (v_
将变为 std::vector<std::unique_ptr<A>>
) 但无法弄清楚如何将 std::make_unique
与初始化列表和可变参数扩展结合起来(我怀疑是因为 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
的类型列表为空。
我有这样的代码:
#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
是仅移动的)。有什么建议么?
像下面这样的 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
的类型列表为空。