문제

반환 유형에서 다형성을 가진 콜블 가능성을 허용하는 C와 같은 언어를 보지 않는 이유는 무엇입니까? 추가 유형의 추론이 장애물이되는지 알 수 있었지만 우리는 많은 언어 본격적인 유형 추론 시스템 (다양한 수준의 "작업"에 효과적).

편집하다: 반환 유형 다형성에 의해 반환 유형에서만 함수 서명을 과부하시키는 것을 의미합니다. 예를 들어, C ++ 및 Java는 리턴 유형이 아닌 공식 매개 변수 유형에서 오버로드 만 허용합니다.

도움이 되었습니까?

해결책

"반환 유형 다형성"이라는 것이 반환 값 유형에 따라 과부하를 의미한다면, 다른 언어에 대해서는 잘 모르겠지만 C ++의 경우 여기에 답이 있습니다 (말의 입에서 거의).

Stroustrup (다른 C ++ 아키텍트의 입력으로 가정)은 과부하 분해능이 '컨텍스트 독립적'이되기를 원했기 때문에 기능 반환 유형은 과부하 분해능에서 작동하지 않습니다. "C ++ 프로그래밍 언어, 제 3 판"의 7.4.1- "오버로드 및 리턴 유형"을 참조하십시오.

그 이유는 개별 연산자 또는 기능 호출 컨텍스트 독립성에 대한 해상도를 유지하는 것입니다.

그들은 과부하가 어떻게 호출되는지에 기초하여 결과가 사용되는 방식 (전혀 사용 된 경우)을 기반으로하기를 원했습니다. 실제로, 결과를 사용하지 않고 많은 기능이 호출되거나 결과는 더 큰 표현의 일부로 사용됩니다. 그들이 결정했을 때 내가 확실한 한 가지 요소는 반환 유형이 해상도의 일부라면 복잡한 규칙으로 해결해야 할 또는 컴파일러 던지기를 해야하는 과부하 된 기능에 대한 많은 호출이 있다는 것입니다. 호출이 모호한 오류.

그리고 주님은 C ++ 과부하 분해능이 서있는대로 충분히 복잡합니다 ...

다른 팁

FONTURE FOO가 더블 또는 int 또는 문자열을 반환 할 수있을뿐만 아니라 FOO가 다른 클래스의 구조 나 객체를 반환 할 수 있도록 어떤 언어 로이 기능을보고 싶습니다. 통화를 명확하게하는 것은 상당히 사소합니다. 전화가 모호한 경우 원하는 반환 유형을 선택하려면 캐스트가 필요합니다. 예시:

string s = foo();    //foo returns a string
double x = foo();    //foo returns a double
int i = foo();       //foo returns an integer
float f = (float)(int)foo();    //call the int foo and convert to float

게다가

Animal a = fooFactory();    //fooFactory returns an Animal
Plant p = fooFactory();     //foofactory returns a Plant

이러한 상황은 자주 나타나지 않지만, 그들이 할 때 해결 방법은 종종 상당히 못 생겼습니다 ...

double x = (double)foo();

Double, Int, Float 등을 반환 할 수있는 foo () 버전이있는 경우 위의 내용은 모호합니다.

C ++에서는 클래스를 사용하여 크게 할 수 있습니다. 예를 들어, 입력 및 출력시 ASCII로 일상적으로 변환되는 데이터 유형이 있다고 가정합니다.

typedef char* pchar;

class   MyType
{
public:

 operator pchar() { return(ConvertToASCII()); }
 MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }

 pchar ConvertToASCII();
 void ConvertFromASCII(pchar ASCII);
}

이 유형의 물건은 종종 C ++ 프레임 워크에서 사용됩니다. 예를 들어, MFC CString 클래스의 이행을 살펴보십시오. IMHO, 특정 상황에서는 위험하지만 매우 유용한 도구입니다.

유형의 자동 수정으로 인해 반환 유형이 가까운 경우 호출 할 기능을 아는 것은 분명하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top