Vor*_*zar 5 c++ templates pointers function-pointers language-lawyer
下面的代码工作正常,但我无法弄清楚它应该有效的C++标准的哪些点.
template< class C, class signature >
void f(signature C::*ptr) { }
Run Code Online (Sandbox Code Playgroud)
当C = A和signature = void(float, int),函数f将是
void f(void(A::*ptr)(float, int))
Run Code Online (Sandbox Code Playgroud)
根据标准的哪些部分,模板是否适用于后者?
最好一一通过。为了避免歧义,我将在示例中使用不同的模板参数名称
template<class C, class signature> void f(signature C::*ptr) {}
Run Code Online (Sandbox Code Playgroud)
所有引用均指 C++14 标准的最新工作草案。
首先我们需要了解,模板参数是如何处理的。
[temp.param]/3标识符不跟随省略号的类型参数将其标识符定义为 typedef-name
所以你的模板定义有两个参数T和签名。signature在模板主体中使用时,因此等效于 typedef
typedef void signature(float, int);
Run Code Online (Sandbox Code Playgroud)
此 typedef 可用于声明函数指针参数,如您的示例所示:
[dcl.fct]/12函数类型的 typedef 可用于声明函数,但不得用于定义函数
在模板函数的参数中,你写signature T::*ptr,让我们看看标准对成员指针是怎么说的:
[dcl.mptr]/1在具有以下形式的声明
T D中DRun Code Online (Sandbox Code Playgroud)nested-name-specifier * attribute-specifier-seq_opt cv-qualifier-seq_opt D1并且nested-name-specifier表示一个类,声明中标识符的类型
T D1为derived-declarator-type-list T,则其标识符的类型D为 derived-declarator-type-list cv-qualifier-seq指向类型为 T 的类嵌套名称说明符成员的指针。
在我们的示例中,Tis signature、函数 typedef 和Dis C::*ptr。
这解释了编译器将为示例推断出哪些类型
void f(void(A::*ptr)(float, int));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
682 次 |
| 最近记录: |