C++模板构造函数

Yip*_*Yay 110 c++ templates constructor

我希望有一个非模板类,其模板构造函数没有参数.

据我所知,它不可能拥有它(因为它会与默认构造函数冲突 - 我是对的吗?),解决方法如下:

class A{
   template <typename U> A(U* dummy) {
   // Do something
   }
};
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 94

调用构造函数模板时无法显式指定模板参数,因此必须通过参数推导推导出它们.这是因为如果你说:

Foo<int> f = Foo<int>();
Run Code Online (Sandbox Code Playgroud)

<int>是类型的模板参数列表Foo,而不是其构造函数.构造函数模板的参数列表无处可去.

即使使用您的解决方法,您仍然必须传递参数才能调用该构造函数模板.你想要实现的目标一点也不清楚.

  • 它可以通过有限的构造函数调用,但似乎不起作用:Foo <int> :: Foo <short>(); (2认同)
  • @updogliu:当然。但是,问题是关于“没有参数的模板构造函数”如果没有函数参数,则可能不会推导出模板参数。 (2认同)

Kea*_*eks 32

您可以创建模板化工厂函数:

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

  • @Martin:我认为这也可以按值返回(非指针).无论如何,RVO应该注意消除副本. (7认同)
  • create()不必进行动态分配.只是`返回Foo(...);`谢谢@Samuel_xL.这对我来说是一个好主意. (2认同)
  • 我不明白。它如何使用空参数列表调用模板化构造函数?看来还是叫普通的吧。 (2认同)

Joh*_*itb 23

据我所知,它不可能拥有它(因为它会与默认构造函数冲突 - 我是对的吗?)

你错了.它不会以任何方式发生冲突.你不能永远打电话给它.

  • 1. 其实,你可以调用模板ctor:`int *p; 一个(p)`。2. 偏见或理想化 ;-) 没有 John Doe。没有什么是典型的德国人......而且绝对不是约翰内斯的话。如果它们听起来没有幽默感,那只是因为 C++ 没有幽默感。 (2认同)
  • @AndreasSpindler 我的意思是,如果构造函数没有参数但仍然是模板参数(仅适用于 C++03。C++11 引入了默认模板参数,这将允许调用它,当然,如果ctor 有默认参数..)。 (2认同)

Yak*_*ont 17

template<class...>struct types{using type=types;};
template<class T>struct tag{using type=T;};
template<class Tag>using type_t=typename Tag::type;
Run Code Online (Sandbox Code Playgroud)

上面的帮助程序允许您将类型用作值.

class A {
  template<class T>
  A( tag<T> );
};
Run Code Online (Sandbox Code Playgroud)

tag<T>类型与除它以外龋类型没有状态的变量.您可以使用它将纯类型值传递给模板函数,并使用模板函数推导出类型:

auto a = A(tag<int>{});
Run Code Online (Sandbox Code Playgroud)

您可以传递多种类型:

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


Arm*_*yan 15

一些要点:

  • 如果声明任何 构造函数(包括模板化的构造函数),编译器将避免声明默认构造函数.
  • 除非你声明了一个拷贝构造函数(对于类X X或者X&或者X const &),编译器将生成默认的拷贝构造函数.
  • 如果您提供一流的X这需要一个模板的构造函数 T const &TT&那么编译器将仍然生成一个默认的非模板拷贝构造函数,即使你可能会认为它不应该,因为当T = X声明的拷贝构造函数相匹配宣言.
  • 在后一种情况下,您可能希望提供非模板化的复制构造函数以及模板化的复制构造函数.他们不会发生冲突.当传递X时,将调用非模板.否则是模板化的

HTH