C++ 泛型模板非类型参数

C++ 泛型模板非类型参数,c++,templates,C++,Templates,我希望类接收非类型模板参数,但不希望指定非类型参数的类型。我可以通过写作来做到这一点: template<class Type, Type param> class A {}; 不,那是办不到的。所有非类型模板参数的类型必须在参数中定义,并且不能从使用中推断出来,即当编译器分析参数type param时,需要知道type的类型。如果A是函数对象,则可以将函数模板成员放入常规clas中 class A { public: template<class Type

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

template<class Type, Type param>
class A
{};

不,那是办不到的。所有非类型模板参数的类型必须在参数中定义,并且不能从使用中推断出来,即当编译器分析参数
type param

时,需要知道
type
的类型。如果
A
是函数对象,则可以将函数模板成员放入常规clas中

class A  
{  
public: 
    template<class Type> 
    void operator()(Type param) { }  
};
A类
{  
公众:
模板
void运算符()(类型参数){}
};
或者将类模板包装到函数模板中

template<class Type> 
class A  
{  
public: 
    void operator()(Type param) { }  
};

template<class Type>
void fun(Type param) 
{ 
    A<Type>()(param); 
}
模板
甲级
{  
公众:
void运算符()(类型参数){}
};
模板
无效乐趣(类型参数)
{ 
A()(参数);
}

将其称为
A()(3)
fun(3)
将推断
Type
int
,其他类似。这是因为函数模板确实推导了它们的参数,但类模板却不是这样。因此,如果您将类模板
A
用于函数对象以外的其他目的,则需要指定其参数。

@R.MartinhoFernandes我在您的评论中在屏幕上看到了6个正方形。穿着他的长袍和巫师帽。@Aniket我需要一个填充符,至少15个字符的要求。我用香蕉是因为它把每一个都算作两个字符。@BenjyKessler:许多其他人也遇到过同样的问题,包括我和我周围一些非常聪明的人。谢谢,我不把一个作为函数对象,但这对将来来说是个好消息。@BenjyKessler我稍微更新了一下,因为函数模板既可以在类内部也可以在类外部。类模板和函数模板之间的差异在很大程度上是历史性的,有关相关方面,请参见示例。
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); 
}