【问题标题】:uncallable template constructor? [duplicate]不可调用的模板构造函数? [复制]
【发布时间】:2013-12-25 17:33:57
【问题描述】:

一个模板化的成员函数,在参数列表中没有使用模板参数,可以通过以下形式调用:

struct C { template <class> func (); };
C c;
C.func <int>();

但是如何调用模板构造函数,它的参数列表中不使用模板参数?

struct D { template <class>  D (); };

当然

D<int> d;

不能是语法,因为这是D &lt;int&gt;类型变量的构造,它是类模板D&lt;class&gt;的实例化。

这不仅仅是一个学术问题,我已经使用了模板构造函数(不使用构造函数参数列表中的模板),基本上是基于策略的工厂,目前使用虚拟参数 mpl::identity &lt;mytype&gt;() 作为解决方法。

【问题讨论】:

  • 虚拟参数几乎是我能够完成这项工作的唯一方法......
  • 所以其他人也没有看到除了解决方法之外的可能性。伤心。但是,谢谢你的链接。奇怪的是,语言一方面允许声明和定义这些构造函数,另一方面却不能使用。一个可能的语法可能是:D d&lt;int&gt;; 唉,这可能与模板化变量(C++14?)发生冲突。

标签: c++ templates


【解决方案1】:

这不是我自己的知识,而是取自其他一些来源,主要是已经发布的C++ template constructor

我假设不可能实例化没有参数的模板构造函数,因为这可能会创建多个默认构造函数。模板在编译时扩展,因此在它们创建的函数上创建了某种重载。 default-constructor 不能重载,所以当你使用多个模板实例时,它必须失败。

除了虚拟变量之外,我只能考虑使用模板化工厂方法或类(如果在您的情况下可能的话)

ex:(使用 int-template 而不是 class-template,因为我现在想不出另一个例子)

class C
{
  int i;
  C() { }
public:
  template<int I>
  static C newInstance()
  {
    C c;
    c.i = I;
    return c;
  }
};

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多