可以使用条件运算符在两个类成员函数调用之间切换

时间:2016-06-06 08:50:57

标签: c++11 conditional member-function-pointers

考虑一下:

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)))())但没有成功......

这是可行的,那么什么是好的语法?一个行代码答案是可取的(使用临时自动变量来存储指向函数的指针太容易了......; - )

1 个答案:

答案 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))()

相关问题