繁体   English   中英

将函数指针非类型模板参数转换为类型模板参数

[英]Conversion of Function Pointer Non-Type Template Parameter to Type Template Parameters

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

它为什么不起作用? 实例化与特化相匹配,后者将复合类型(函数, 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
}

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

但是,给定的代码通过专门化(一般)类型FuncSignature用于一元函数类型( Type1 (Type2)是一种函数类型,给定类型Type1Type2 )。

因此第一行定义了一个通用模板,下一组行专门用于类型形式Type1 (Type2) ,它们在两种类型上进行参数化,因此专门化具有非空模板参数列表,并且main实例化模板对于具体类型char (int) (一个接受int并返回char的函数)。

是。 此代码符合标准:)

如果是:

Obj<char (int)>

Type1charType2int 因此, Obj::var1char类型的成员变量, Obj::var2int类型的成员变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM