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
相关产品推荐
相关产品推荐

