我经常发现需要使用以下模式:
template<typename T>
class SomeClass : public Base {
SomeClass(const T& t) {...}
...
};
template<typename T>
SomeClass<T>* makeSomeClass(const T& t) {
return new SomeClass<T>(t);
}
并使用它:
Base* = makeSomeClass(123);
当我不想显式指定 T
时,这很有用,因为它非常复杂(函数类型等),并且函数参数可以隐式推导类型。
有没有办法在没有额外的“make”功能的情况下做到这一点?为什么模板推导仅在函数参数中有效,而在构造函数参数中无效?
最佳答案
不,如果没有额外的 make 函数,就没有办法做到这一点。
它不能与构造函数一起使用的原因是因为它会非常复杂。考虑一下:
template <typename T>
struct Foo
{
Foo(const T& val) { ... }
Foo(const Foo<T>& other) { ... } // Copy constructor
};
Foo<int> x;
如果我随后打电话怎么办:
Foo(x);
这会给我一个 Foo< Foo<int> >
或者我调用 Foo<int>
的复制构造函数?
太多地方会产生歧义,所以额外的函数是必要的。
请注意,您可以使用模板稍微自动化创建 make 函数:
template <template <typename> class TemplateClass, typename Type>
TemplateClass<Type> make(const Type& x)
{
return TemplateClass<Type>(x);
}
然后你可以使用:
make<SomeClass>(123); // returns a SomeClass<int>
关于C++:根据参数实例化模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6485791/