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
,而不是其构造函数.构造函数模板的参数列表无处可去.
即使使用您的解决方法,您仍然必须传递参数才能调用该构造函数模板.你想要实现的目标一点也不清楚.
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)
Joh*_*itb 23
据我所知,它不可能拥有它(因为它会与默认构造函数冲突 - 我是对的吗?)
你错了.它不会以任何方式发生冲突.你不能永远打电话给它.
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 const
&
),编译器将生成默认的拷贝构造函数. T const &
或T
或T&
那么编译器将仍然生成一个默认的非模板拷贝构造函数,即使你可能会认为它不应该,因为当T = X声明的拷贝构造函数相匹配宣言.HTH