【发布时间】:2016-04-03 23:56:26
【问题描述】:
如何在具有模板化构造函数的类上调用 make_shared 或 make_unique?这是一个例子:
class A
{
/// constructor shared ptr
A(shared_ptr<X> x) ...
/// constructor that creates new shared ptr
template <class T> A() : A(make_shared<T>(...)) {}
};
make_shared<A<T>>() 没有意义(也无法编译),因为这更适用于模板化类,而不是模板化构造函数。
make_shared<A><T>() 和 make_shared<A>(<T>()) 都不编译---也不看起来应该。同上make_shared<A, T>()
有没有办法在调用make_shared时指定构造函数调用的模板?我认为答案将适用于make_unique;如果不是,请指出。谢谢!
(为了阐明模板的工作原理,我编辑了代码。)
【问题讨论】:
-
你如何用 raw new 来称呼它?...你不能。
make_...也一样 -
AFAIK 一个构造函数不能被模板化,除非它有一个使用模板的输入参数:
template <class T> A(T t) { ... }。调用构造函数时不能指定模板值(不允许new A<T>()),但编译器可以根据输入参数推断类型,例如:new A(value);。所以它与make_...()函数一起使用。没有办法指定构造函数模板参数类型,但如果构造函数接受输入参数,那么make...()可以将自己的输入参数传递给构造函数,让编译器推断模板类型。 `
标签: c++ templates c++11 smart-pointers make-shared