如何通过成员函数指针调用模板成员函数及相关标准依据
问题解答
正确调用语法
你可以通过以下语法调用该成员函数指针:
int main() { Derived d; // 针对对象使用.*运算符调用,示例中指定模板参数T为int int int_result = (d.*func_ptr<int>)(); // 针对对象指针使用->*运算符调用,示例中指定模板参数T为double Derived* d_ptr = &d; double double_result = (d_ptr->*func_ptr<double>)(); return 0; }
相关语法说明:
func_ptr是变量模板,使用时必须显式指定模板参数T来实例化对应特化的成员函数指针- 成员函数指针调用运算符
.*和->*的优先级低于函数调用运算符(),因此必须将指针调用部分用括号包裹,否则会触发语法错误。
代码可编译的原因及标准依据
这段代码的合法性由C++标准的两条规则支撑:
- 基类成员指针的隐式转换规则
C++标准[conv.mem]章节第2条明确规定:指向公有基类的非静态成员的指针,可以隐式转换为指向其公有派生类的同类型成员指针。你的Derived是Base的公有派生类,天然包含Base的所有成员,因此&Base::fun可以合法赋值给T (Derived::*)()类型的变量。 - 函数模板的实参推导规则
你书写&Base::fun时没有显式指定模板参数T,编译器会根据赋值目标的类型T (Derived::*)()自动推导Base::fun的模板参数T,无需手动显式标注。
另外需要注意:func_ptr使用了C14引入的变量模板语法,因此需要编译器开启C14及更高版本的编译选项才能编译通过。
内容的提问来源于stack exchange,提问作者Karen Baghdasaryan
相关产品推荐
相关产品推荐

