我希望我的类接收非类型模板参数,但我不想指定非类型参数的类型。我可以通过写来做到这一点:
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;
不,那是做不到的。所有非类型模板实参的类型都必须在形参中定义,并且永远不能从使用中推断出来,即编译器分析实参时Type
需要知道Type param
。
如果A
是函数对象,您可以将函数模板成员放在常规类中
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
,其他类似。这是因为函数模板确实推导出了它们的参数,但对于类模板则不然。因此,如果您将类模板A
用于函数对象以外的其他目的,则需要指定其参数。