2010-11-28 157 views
6

下面的示例代码在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++标准?

+1

是的,它的法律, 当不确定,我试着http://www.comeaucomputing.com/tryitout/来检查合规性。它由于部分模板专门化而起作用。 – Anycorn 2010-11-28 15:37:34

+0

使用元编程,您可以使用Boost FunctionTypes库实际提取有关函数类型(此处为`char(int)`)的大多数信息:http://www.boost.org/doc/libs/1_45_0/libs/function_types/ doc/html/index.html它可能是硬编码,但它是一个有趣的阅读:) – 2010-11-28 20:00:42

回答

7

为什么它不工作?实例化与专业化相匹配,该专业化将化合物类型(功能char(int))的组分类型(charint)提取为Type1Type2

顺便说一下,您没有非类型的模板参数。函数类型是一种类型。如果你有一个非类型模板参数的话,就应该是这样的:

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 
} 
3

这个问题是用词不当,因为FuncSignature不是非模板参数。

然而,给定的代码作品专业的(普通)为一元函数类型类型FuncSignatureType1 (Type2)是一个功能类型,给定类型的Type1Type2)。

所以第一行定义了一个通用模板,线的下一组专门它类型形式Type1 (Type2),它们是参数化的两种类型,因而专业化具有非空模板参数列表,并且main实例化具体类型为char (int)的模板(取int并返回char的函数)。

0

是。此代码符合标准的:)

在的情况下:

Obj<char (int)> 

Type1charType2int。因此,Obj::var1是类型为char的成员变量,而Obj::var2是类型为int的成员变量。