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);
}