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

C++03中不使用typedef定义返回成员函数指针的operator[]语法

不用typedef时,C++03中返回成员函数指针引用的operator[]语法

嘿,我懂你这种困惑——一开始真的很容易把typedef当成宏一样直接替换文本,但其实它是创建了一个类型别名,语法上有特定的规则,尤其是成员函数指针这种复杂类型,直接替换肯定会出错!

先从你熟悉的typedef写法入手,比如原来的代码大概是这样的:

class Foo {
public:
    // 定义成员函数指针的typedef
    typedef void (Foo::*TFunc)();

    // 返回TFunc的引用
    TFunc& operator[](int idx) {
        static TFunc funcs[] = {&Foo::bar, &Foo::baz};
        return funcs[idx];
    }

    void bar() {}
    void baz() {}
};

现在要去掉typedef,核心是要把TFunc&对应的完整类型写出来。TFunc是void (Foo::*)()(指向Foo类无参void成员函数的指针),所以TFunc&就是指向Foo类无参void成员函数的指针的引用,对应的类型是void (Foo::*&)()。

把这个类型套进operator[]的声明里时,要注意C++函数声明的语法规则——函数名要嵌在返回类型的复杂结构中,正确的写法是:

class Foo {
public:
    // 不用typedef的operator[]定义
    void (Foo::*& operator[](int idx))() {
        static void (Foo::*funcs[])() = {&Foo::bar, &Foo::baz};
        return funcs[idx];
    }

    void bar() {}
    void baz() {}
};

为什么要这么写?

你可以把这个声明拆开来理解:

  • operator[](int idx) 是我们要定义的运算符函数
  • 它的返回类型是 void (Foo::*&)() —— 也就是“指向Foo类无参void成员函数的指针的引用”
  • 为了符合C++的语法,我们需要把函数名放在返回类型的括号结构里,所以就有了void (Foo::*& operator[](int idx))()这种看起来有点绕的写法

这种写法之所以容易出错,就是因为成员函数指针的语法本身就有很多括号(用来区分优先级),typedef帮我们把这些复杂的结构封装成了一个简单的名字,去掉typedef后就得把这些结构完整地写出来,不能像宏那样直接替换字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:08:52