我希望我的类接收非类型模板参数,但我不想指定非类型参数的类型。我可以这样写:
template<class Type, Type param>
class A
{};
然后可以按如下方式使用:
A<int,3> a;
这是多余的,因为一旦我知道param = 3
,我就知道Type = int
。有没有办法写这个,以便所有以下行编译和实例化不同的类型?
A<3> a;
A<3.0> b;
A<3.0f> c;
答案 0 :(得分:5)
不,那是不可能做到的。必须在参数中定义所有非类型模板参数的类型,并且永远不能从使用中推断出,即当编译器分析参数时,您需要Type
已知 { {1}}。
答案 1 :(得分:1)
如果A
是一个函数对象,你可以将一个函数模板成员放在常规的clas中
class A
{
public:
template<class Type>
void operator()(Type param) { }
};
或将类模板包装在函数模板中
template<class Type>
class A
{
public:
void operator()(Type param) { }
};
template<class Type>
void fun(Type param)
{
A<Type>()(param);
}
并将其称为A()(3)
或fun(3)
会将Type
推断为int
,其他类推。这是因为函数模板DO推断了它们的参数,但对于类模板却不是这样。因此,如果您将类模板A
用于除函数对象之外的其他目的,则需要指定其参数。