以下示例代码在gcc下编译并按我希望的方式工作。它允许我使用函数定义作为模板参数来实例化一个对象,但是该类能够使用函数中的不同类型,就像它们作为类型模板参数单独传递一样。
template<class FuncSignature> class Obj;
template<class Type1, class Type2> class Obj<Type1 (Type2)>
{
public:
Type1 var1;
Type2 var2;
};
int main(int argc, char **argv)
{
Obj<char (int)> A;
A.var1 = 'a';
A.var2 = 3;
}
即使它似乎有用,但我不确定这段代码是做什么的。为什么这段代码有效并且符合C ++标准?
答案 0 :(得分:7)
为什么它不起作用?实例化与特化相匹配,后者将复合类型(函数char
)的组件类型(int
和char(int)
)提取为Type1
和Type2
顺便说一句,您没有非类型模板参数。函数类型是一种类型。如果您有一个非类型模板参数,那么它将如下所示:
template <char(int)>
struct X {};
char foobar(int);
int main()
{
X<foobar> x;
}
或完全模板化:
template <class R, class A, R(A)>
// ^^^^
// non-type parameter
struct X {};
char foobar(int);
int main()
{
X<char, int, foobar> x;
// ^^^^^^
// a specific function, not type
}
答案 1 :(得分:3)
这个问题用词不当,因为FuncSignature
不是非类型模板参数。
但是,给定的代码通过专门化(一般)类型FuncSignature
来实现一元函数类型(Type1 (Type2)
是函数类型,给定类型Type1
和Type2
)
因此第一行定义了一个通用模板,下一组行专门用于类型形式Type1 (Type2)
,它们在两种类型上进行参数化,因此专门化具有非空模板参数列表,并且main
实例化具体类型char (int)
的模板(采用int
并返回char
的函数)。
答案 2 :(得分:0)
是。此代码符合标准:)
以下情况:
Obj<char (int)>
Type1
为char
,Type2
为int
。因此,Obj::var1
是char
类型的成员变量,Obj::var2
是类型int
的成员变量。