C 模板带有签名和类型指向成员函数的指针

C++ Templates with pointer to member function by signature and type

本文关键字:成员 函数 指针 类型      更新时间:2023-10-16

下面的代码正常工作,但我无法弄清楚C 标准的哪些点应该有效。

template< class C, class signature >
void f(signature C::*ptr) { }

C = Asignature = void(float, int)时,功能F为

void f(void(A::*ptr)(float, int))

基于标准的哪些部分,模板适用于后者?

最好通过一个。为了避免歧义,我将在示例中使用不同的模板参数名称

template<class C, class signature> void f(signature C::*ptr) {}

所有报价都涉及C 14标准的最新工作草案。

首先,我们需要了解模板参数如何处理。

[temp.param]/3 类型参数的标识符未遵循省略号定义 它的标识符是Typedef-name

因此,您的模板定义具有两个参数T和签名。在模板主体中使用signature时,它等效于Typedef

typedef void signature(float, int);

此键入可以用来声明函数指针参数,如您的示例:

[dcl.fct]/12 函数类型的TypeDef可以用于声明功能,但应 不用于定义函数

在模板函数的参数中,您编写signature T::*ptr,让我们看看标准对成员指针的评价:

[dcl.mptr]/1 在声明 T D中,其中 D具有表格

nested-name-specifier * attribute-specifier-seq_opt cv-qualifier-seq_opt D1

nested-name-depifier 表示类别, 声明 T D1中的标识符是派生式驱动器型列表 t ,然后D的标识符的类型为 派生declarator-type-list cv-qualifier-seq指针指向类型T 的类嵌套名称的成员。

在我们的示例中,Tsignature,函数Typedef,DC::*ptr

这解释了编译器将推论的示例

的类型
void f(void(A::*ptr)(float, int));