C++:根据参数实例化模板类

标签 c++ templates

我经常发现需要使用以下模式:

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/

相关文章:

c++ - 如何将 .cast() 方法应用于比较运算符的输出?

从 .lib 切换到 .so 后,Android 应用程序崩溃

c++ - 如何让编译器使用正确的模板特化?

c++ - 给定类型为 Container<T>::Iterator 的函数参数,我如何实现特定类型 T 的特定重载?

c++ - 从模板化父类中的派生内部类访问 protected 成员变量

c++ - 解决一个全局性的

c++ - 遍历 vector 并删除某些元素的正确方法是什么

java - "switch case"已经存在,为什么还要学习 "if else"

html - Web 开发人员的框架/模板

C++ 错误 : class template has already been defined