2012-10-24 4 views
8

의 난은 C 있다고 가정 해 봅시다 ++ 클래스는 가능한이삼항 연산자와 함수 서명

MyClassInstance->Foo(booleanValue?24:"a string"); 

같은 삼항 연산자를 사용하고 MyClass의 다른 기능을하는 것입니다 booleanValue의 값에 따라 호출됩니까?

+2

이 재미있다 ... – mauris

+6

당신이 컴파일하고 그것을 어떻게되는지 실행하려고 있나요? –

+0

이것은 컴파일되지 않습니다. 컴파일러는 다른 유형의 삼항 연산자에 대해 불평 할 것입니다. –

답변

21

삼항 연산자에는 포함되지 않습니다. 삼항 표현식의 유형은 두 번째 및 세 번째 피연산자의 공통 유형입니다. 일반 유형이 없다면 사용할 수 없습니다.

if (booleanValue) 
    MyClassInstance->Foo(24); 
else 
    MyClassInstance->Foo("a string"); 
5

아니요. 과부하 해결을 수행하기 위해 컴파일러에서 "booleanValue?24:"a string"의 유형은 무엇입니까?"라고 묻습니다. 그 질문에 답할 수는 없습니다.

+0

컴파일 타임에 * 답할 수 없습니다. (내 투표지 BTW가 아닙니다 - 대답을 향상시키기 위해 작은 제안을 함) –

+0

@Paul C++ 식에는 컴파일시에만 유형이 있습니다. 시각. 다른 것에 대해 이야기하는 것이 이치에 맞지 않습니다. –

+0

네, 필자는 요점은 * 동적으로 호출 할 함수, 즉 런타임에 호출 할 함수를 결정할 수 있다고 생각하지만 C++에서는 컴파일 타임에 유형을 알아야합니다. –

7

삼항 조건식의 유형은 두 피연산자가 사기 ­ ­ 버전 tible있는 일반적인 유형이있다 : 그래서 그냥 평범한 if 문을 사용합니다. 당신은 분명히 이 아니며은 "동적 과부하 해결"을 수행 할 수 있습니다.

intchar const *에 공통된 유형이 없으므로 코드는 컴파일되지 않습니다 (테스트했을 때 확실하게 ­ 것으로 알려짐).

은 (당신은 decltype과 함께, 삼항 조건이 정확하게 때문에 std::common_type 특성 클래스 템플릿의 구현에 그 의미로 사용된다는 것을 알고 기뻐할 수 있습니다.)

(조건 정적 을 알고있는 경우 같은 sizeof(int) != 7로, 당신은 정적하지만 물론, 조건부 오버로드 확인을 수행한다는 것을 유사한 보이는 코드를 작성하는 ­ 중앙 정보국 (CIA) ­ lization 템플릿 SPE를 사용할 수 있습니다.)

5

아니요, 허용되지 않습니다.

오버로드는 컴파일 타임이므로 런타임에 그렇게 작동하지 않습니다.

당신이 그러나 때로는 같은 것을 할 수있는 욕망이 iostream으로, 정확하게 수행 할 것입니다 코드의 공통되지 않습니다 : VAR1 및 VAR2 다른 유형이

os << (condition ? var1 : var2)

. 그것도 작동하지 않습니다.

당신은 할 수 :

MyClassInstance->Foo(booleanValue ? boost::any(24) : boost::any("a string"));