【问题标题】:C++: instantiate a templated class according to an argumentC++:根据参数实例化模板类
【发布时间】:2011-09-23 01:39:02
【问题描述】:

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

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”功能的情况下做到这一点?为什么模板推导只在函数参数中有效,而在构造函数参数中无效?

【问题讨论】:

标签: c++ templates


【解决方案1】:

不,没有额外的 make 函数就无法做到这一点。

它不适用于构造函数的原因是它会非常复杂。考虑一下:

template <typename T>
struct Foo
{
    Foo(const T& val) { ... }
    Foo(const Foo<T>& other) { ... } // Copy constructor
};

Foo<int> x;

如果我再打电话怎么办:

Foo(x);

这会给我一个Foo&lt; Foo&lt;int&gt; &gt; 还是我为Foo&lt;int&gt; 调用复制构造函数?

在太多的地方会模棱两可,所以额外的功能是必要的。

请注意,您可以使用模板模板自动创建一些 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>

【讨论】:

    【解决方案2】:

    确实在构造函数参数中起作用,如果构造函数本身就是一个模板。不同之处在于,当您使用助手时,您使用的是 function 模板,编译器可以在其中推断类型。如果没有帮助器,您将使用 class 模板,编译器必须在调用(非模板)构造函数之前以某种方式推断类型。

    【讨论】:

      【解决方案3】:

      有没有没有额外功能的方法?不,没有。为什么扣除只适用于函数?因为使用函数,您实际上提供了参数。如果允许类使用,那么推断模板参数的唯一方法是在调用构造函数进行初始化的情况下,这会产生许多额外的规则和异常并使事情复杂化,

      【讨论】:

      • 复制构造器&转换之类的我会补充
      猜你喜欢
      • 2020-02-08
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2014-04-20
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      相关资源
      最近更新 更多