C 模板带有签名和类型指向成员函数的指针
C++ Templates with pointer to member function by signature and type
下面的代码正常工作,但我无法弄清楚C 标准的哪些点应该有效。
template< class C, class signature >
void f(signature C::*ptr) { }
当C = A
和signature = 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 的类嵌套名称的成员。。
在我们的示例中,T
是signature
,函数Typedef,D
是C::*ptr
。
这解释了编译器将推论的示例
的类型void f(void(A::*ptr)(float, int));
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法