5

我希望我的类接收非类型模板参数,但我不想指定非类型参数的类型。我可以通过写来做到这一点:

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;
4

2 回答 2

5

不,那是做不到的。所有非类型模板实参的类型都必须在形参中定义,并且永远不能从使用中推断出来,即编译器分析实参时Type需要知道Type param

于 2013-02-05T15:22:34.187 回答
1

如果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)将推断Typeint,其他类似。这是因为函数模板确实推导出了它们的参数,但对于类模板则不然。因此,如果您将类模板A用于函数对象以外的其他目的,则需要指定其参数。

于 2013-02-05T15:38:17.183 回答