我想让我的类接收非类型模板参数,但我不想指定非类型参数的类型。我可以写做:泛型模板非类型参数
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;
我想让我的类接收非类型模板参数,但我不想指定非类型参数的类型。我可以写做:泛型模板非类型参数
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 param
时,需要Type
为已知。
呃,非常感谢无论如何,认为这将是值得一试。 –
@BenjyKessler:许多其他人也遇到同样的问题,包括我和周围一些非常聪明的人。 –
如果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
用于除函数对象之外的其他目的,则需要指定其参数。
谢谢,我不使用A作为函数对象,但这是很好的知道未来。 –
@BenjyKessler我稍微更新了它,因为函数模板既可以在类内部也可以在外部。类和函数模板之间的区别在很大程度上是历史的,参见例如这[相关问题](http://stackoverflow.com/q/11968994/819272)。 – TemplateRex
No. –
@ R.MartinhoFernandes我的屏幕上有6个方格在您的评论中。穿着他的长袍和精灵帽子。 –
@Aniket我需要填充符最少15个字符的要求。我使用香蕉http://i.stack.imgur.com/DvRWZ.png,因为SO将每一个都视为两个字符。 –