考虑一下:
int func1( int i );
int func2( int i );
条件运算符可以这样使用:
int res = (cond)?func1(4):func2(4);
或者,如果两者都可以使用相同的参数:
int res = ((cond)?func1:func2)(4);
现在,类的成员函数怎么样:
class T
{
public:
T( int i ) : i(i) {}
int memfunc1() { return 1*i; }
int memfunc2() { return 2*i; }
private:
int i;
};
我试过这个,但它不起作用:
T t(4);
int res2 = t.((cond)?memfunc1:memfunc2)();
...尝试了其他语法((t.*((cond)?&(T::memfunc1):&(T::memfunc2)))()
)但没有成功......
这是可行的,那么什么是好的语法?一个行代码答案是可取的(使用临时自动变量来存储指向函数的指针太容易了......; - )
答案 0 :(得分:1)
§5.3.1[expr.unary.op] / p4:
只有在使用显式
&
并且其操作数为qualified-id未包含时,才会形成指向成员的指针 在括号内。 [注意:即表达式&(qualified-id)
,其中包含qualified-id 括号,不形成“指向成员的指针”类型的表达式。qualified-id也不是,因为 对于非静态成员函数,没有从qualified-id到类型“指针”的隐式转换 成员函数“因为从函数类型的左值到类型”指向函数“(4.3)的指针。也不是&unqualified-id
指向成员的指针,即使在unqualified-id类的范围内也是如此。 - 结束记录]
如果仍然没有帮助,您可以在下面找到正确的语法:
(t.*(cond ? &T::memfunc1 : &T::memfunc2))()