C ++模板构造函数

我希望有一个不带参数的模板构造函数的非模板类。

据我所知,这是不可能的(因为它会违反默认的构造函数 – 我是吗? ), 解决方法如下:

class A{ template <typename U> A(U* dummy) { // Do something } }; 

也许有更好的替代scheme(或更好的解决方法)?

谢谢。

调用构造函数模板时没有办法明确指定模板参数,所以必须通过参数推导来推导出它们。 这是因为如果你说:

 Foo<int> f = Foo<int>(); 

<int>Footypes的模板参数列表,而不是它的构造函数。 没有地方的构造模板的参数列表去。

即使你的解决方法,你仍然需要传递一个参数来调用构造函数模板。 目前还不清楚你想要达到的目标。

您可以创build一个模板工厂function:

 class Foo { public: template <class T> static Foo* create() // could also return by value, or a smart pointer { return new Foo(...); } ... }; 

据我所知,这是不可能的(因为它会违背默认的构造函数 – 我说得对吗?)

你错了。 它不以任何方式冲突。 你永远无法称呼它。

一些观点:

  • 如果你声明了任何构造函数(包括一个模板化的构造函数),编译器将避免声明一个默认的构造函数。
  • 除非你声明了一个复制构造函数(对于X类,它需要XX&或者X const & ),编译器将会生成默认的复制构造函数。
  • 如果您为类X提供了一个模板构造函数,它接受T const &TT&然后编译器将生成一个默认的非模板化的构造函数,尽pipe您可能认为它不应该是因为当T = X时声明匹配复制构造函数声明。
  • 在后一种情况下,您可能希望提供一个非模板化的复制构造函数以及模板化的构造函数。 他们不会冲突。 当X通过时,将被调用。 否则,模板化

HTH

 template<class...>struct types{using type=types;}; template<class T>struct tag{using type=T;}; template<class Tag>using type_t=typename Tag::type; 

上面的帮助者可以让你使用types作为值。

 class A { template<class T> A( tag<T> ); }; 

tag<T>types是一个variables,除了它的龋齿types外,没有任何状态。 您可以使用它将纯types值传递给模板函数,并通过模板函数推导出types:

 auto a = A(tag<int>{}); 

您可以传入多个types:

 class A { template<class T, class U, class V> A( types<T,U,V> ); }; auto a = A(types<int,double,std::string>{}); 

你可以这样做:

 class C { public: template <typename T> C(T*); }; template <typename T> T* UseType() { static_cast<T*>(nullptr); } 

然后使用int作为构造函数的模板参数来创buildtypes为C的对象:

 C obj(UseType<int>()); 

由于您无法将模板parameter passing给构造函数,因此此解决scheme实质上将模板参数转换为常规参数。 在调用构造函数时使用UseType<T>()函数可以清楚地看到代码中的某个人,该参数的目的是告诉构造函数使用什么types。

一个用例就是如果构造函数创build派生类对象并将其分配给作为基类指针的成员variables。 (构造函数需要知道使用哪个派生类,但是由于总是使用相同的基类指针types,所以类本身不需要模板化。)

尝试做类似的事情

 template<class T, int i> class A{ A(){ A(this) } A( A<int, 1>* a){ //do something } A( A<float, 1>* a){ //do something } . . . }; 

这是一个解决方法。

创buildA的模板子类B.在A的构造函数中构造独立于模板参数的部分。 在B的构造函数中做模板参数相关的部分。