You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过成员函数指针调用模板成员函数及相关标准依据

问题解答

正确调用语法

你可以通过以下语法调用该成员函数指针:

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++标准的两条规则支撑:

  1. 基类成员指针的隐式转换规则
    C++标准[conv.mem]章节第2条明确规定:指向公有基类的非静态成员的指针,可以隐式转换为指向其公有派生类的同类型成员指针。你的Derived是Base的公有派生类,天然包含Base的所有成员,因此&Base::fun可以合法赋值给T (Derived::*)()类型的变量。
  2. 函数模板的实参推导规则
    你书写&Base::fun时没有显式指定模板参数T,编译器会根据赋值目标的类型T (Derived::*)()自动推导Base::fun的模板参数T,无需手动显式标注。

另外需要注意:func_ptr使用了C14引入的变量模板语法,因此需要编译器开启C14及更高版本的编译选项才能编译通过。

内容的提问来源于stack exchange,提问作者Karen Baghdasaryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:09:03