2016-06-06 3 views
0

이 고려 호출는 조건 연산자는 두 개의 클래스 멤버 함수 사이를 전환하는 데 사용할 수 있습니다

int func1(int i); 
int func2(int i); 

조건부 연산자처럼 사용할 수 있습니다 모두 같은 매개 변수를 사용할 수있는 경우,

int res = (cond)?func1(4):func2(4); 

또는 :

int res = ((cond)?func1:func2)(4); 

이제 클래스의 멤버 함수에 대한 어떤 :

는 그 다음 해 드리겠습니다 어떤 것입니까 ... 아니 성공도 ( (t.*((cond)?&(T::memfunc1):&(T::memfunc2)))()) 다른 구문을 시도 ...

T t(4); 
int res2 = t.((cond)?memfunc1:memfunc2)(); 

을 :

class T 
{ 
public: 
    T(int i) : i(i) {} 

    int memfunc1() { return 1*i; } 
    int memfunc2() { return 2*i; } 

private: 
    int i; 
}; 

나는이 시도했지만 작동하지 않습니다 좋은 구문일까요? 한 줄의 코드 대답은 너무 쉬운 것입니다 함수에 대한 포인터를 저장하기 위해 임시 자동 변수를 사용하여 (바람직하다 ... ;-)

+1

' (t –

+0

@PiotrSkotnicki : 그것은 작동합니다, 나는 당신이 단지 내 시도에서 괄호를 제거해야만했다는 것을 믿을 수 없다. ;-)!! (cond? & T :: memfunc1 : & T :: memfunc2)! 칭찬을 받기 위해 답으로 게시하십시오. – jpo38

+1

낡은'cond? memfunc1() : memfunc2()'? –

답변

1

§는 5.3.1/P4 [expr.unary.op] :

멤버에 대한 포인터입니다 명시 적 &이 사용되고 피연산자가 qualified-id 인 경우에만 형성되며 괄호 안에 이 포함되지 않습니다. [참고 : ". 멤버에 대한 포인터의"하는 qualified-id로부터 암시 적 변환이 존재하지 때문에 qualified-id가 괄호로 묶인 식 &(qualified-id)이다는 입력의 식을 형성하지 둘 qualified-id을 수행하지 않는다 비 정적 멤버 함수를 " 멤버 함수 포인터"유형으로 변환합니다. 함수 유형의 lvalue 유형에서 "함수 포인터"유형 (4.3)이 있습니다. &unqualified-idunqualified-id의 클래스 범위 내에서도 멤버에 대한 포인터가 아닙니다. - 엔드 노트]

여전히 해결되지 않으면 아래의 올바른 구문 발견 할 수 있습니다

(t.*(cond ? &T::memfunc1 : &T::memfunc2))()