jef*_*yer 5 c++ templates arguments
为什么C++不能确定我打算unique_ptr<A>
用这种语法创建一个?(a先前已被宣布为unique_ptr<A>
)
a = unique_ptr(new A());
Run Code Online (Sandbox Code Playgroud)
必须要包含它似乎非常多余<A>
.这适用于我使用的大多数函数模板,为什么不使用unique_ptr?
编辑: C++现在支持make_unique,没有冗余.
Jam*_*lis 10
std::unique_ptr
是一个类模板,而不是一个函数模板.参数推导仅适用于函数模板,而不适用于类模板.
一个常用的技巧是编写一个函数模板,用于创建实例化类模板类型的对象,例如:
template <typename T>
std::unique_ptr<T> make_unique_ptr(T* ptr)
{
return std::unique_ptr<T>(ptr);
}
Run Code Online (Sandbox Code Playgroud)
对于std::unique_ptr
,不过,我会避免这样做:一个std::unique_ptr
对象应该直接采取动态分配对象的所有权,所以不应该有需要这一点.您的代码应该写成:
std::unique_ptr<A> a(new A());
Run Code Online (Sandbox Code Playgroud)
或者,如果a
已经存在,reset()
可以使用以下呼叫:
a.reset(new A());
Run Code Online (Sandbox Code Playgroud)
至于为什么类型推导不能用于实例化类模板,请考虑以下示例:
template <typename T>
struct X
{
template <typename U> X(U) { }
};
Run Code Online (Sandbox Code Playgroud)
没有办法T
可以从构造函数的调用中推断出来.即使在存在具有类型参数的构造函数的"更简单"情况下,T
仍然可能存在问题,因为构造函数可能会被重载.