2013-02-05 234 views
4

我想让我的类接收非类型模板参数,但我不想指定非类型参数的类型。我可以写做:泛型模板非类型参数

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

No. –

+0

@ R.MartinhoFernandes我的屏幕上有6个方格在您的评论中。穿着他的长袍和精灵帽子。 –

+1

@Aniket我需要填充符最少15个字符的要求。我使用香蕉http://i.stack.imgur.com/DvRWZ.png,因为SO将每一个都视为两个字符。 –

回答

5

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

+0

呃,非常感谢无论如何,认为这将是值得一试。 –

+1

@BenjyKessler:许多其他人也遇到同样的问题,包括我和周围一些非常聪明的人。 –

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)将推导出Typeint,其他类似。这是因为函数模板DO会推导出它们的参数,但对于类模板并非如此。因此,如果您将类模板A用于除函数对象之外的其他目的,则需要指定其参数。

+0

谢谢,我不使用A作为函数对象,但这是很好的知道未来。 –

+0

@BenjyKessler我稍微更新了它,因为函数模板既可以在类内部也可以在外部。类和函数模板之间的区别在很大程度上是历史的,参见例如这[相关问题](http://stackoverflow.com/q/11968994/819272)。 – TemplateRex