반환 유형별 오버로딩
나는 아직 나에게 혼란스러워 보이는이 주제에 대해 몇 가지 질문을 읽었습니다. 저는 방금 C ++를 배우기 시작했고 아직 템플릿이나 연산자 오버로딩 등을 연구하지 않았습니다.
이제 과부하하는 간단한 방법이 있습니다.
class My {
public:
int get(int);
char get(int);
}
템플릿이나 이상한 행동없이? 아니면 그냥
class My {
public:
int get_int(int);
char get_char(int);
}
?
아니에요. 반환 유형에 따라 메서드를 오버로드 할 수 없습니다.
오버로드 해결은 함수 서명 을 고려합니다 . 함수 서명은 다음으로 구성됩니다.
- 기능 명
- cv 한정자
- 매개 변수 유형
그리고 여기에 인용문이 있습니다.
1.3.11 서명
오버로드 해결 (13.3)에 참여하는 함수에 대한 정보 : 매개 변수 유형 목록 (8.3.5) 및 함수가 클래스 멤버 인 경우 함수 자체 및 클래스에 대한 cv 한정자 (있는 경우) 여기서 멤버 함수가 선언됩니다. [...]
옵션 :
1) 메소드 이름 변경 :
class My {
public:
int getInt(int);
char getChar(int);
};
2) 출력 매개 변수 :
class My {
public:
void get(int, int&);
void get(int, char&);
}
3) 템플릿 ...이 경우 과잉.
가능하지만 초보자에게 추천 할 수있는 기술인지는 잘 모르겠습니다. 다른 경우와 마찬가지로 반환 값이 사용되는 방식에 따라 함수를 선택하려는 경우 프록시를 사용합니다. 먼저 getChar
및 같은 함수를 정의한 getInt
다음 다음 get()
과 같은 프록시를 반환하는 제네릭 을 정의합니다 .
class Proxy
{
My const* myOwner;
public:
Proxy( My const* owner ) : myOwner( owner ) {}
operator int() const
{
return myOwner->getInt();
}
operator char() const
{
return myOwner->getChar();
}
};
필요한만큼 많은 유형으로 확장하십시오.
아니요, 반환 유형으로 오버로드 할 수 없습니다. 매개 변수 유형 및 const / volatile 한정자에 의해서만.
한 가지 대안은 참조 인수를 사용하여 "반환"하는 것입니다.
void get(int, int&);
void get(int, char&);
나는 아마도 템플릿을 사용하거나 두 번째 예제와 같이 다른 이름의 함수를 사용할 것입니다.
다음과 같이 생각할 수 있습니다.
당신은 :
int get(int);
char get(int);
And, it is not mandatory to collect the return value of the function while invoking.
Now, You invoke
get(10); -> there is an ambiguity here which function to invoke.
So, No meaning if overloading is allowed based on the return type.
There is no way to overload by return type in C++. Without using templates, using get_int
and get_char
will be the best you can do.
You can't overload methods based on return types. Your best bet is to create two functions with slightly different syntax, such as in your second code snippet.
While most of the other comments on this problem are technically correct, you can effectively overload the return value if you combine it with overloading input parameter. For example:
class My {
public:
int get(int);
char get(unsigned int);
};
DEMO:
#include <stdio.h>
class My {
public:
int get( int x) { return 'I'; };
char get(unsinged int x) { return 'C'; };
};
int main() {
int i;
My test;
printf( "%c\n", test.get( i) );
printf( "%c\n", test.get((unsigned int) i) );
}
The resulting out of this is:
I
C
you can't overload a function based on the return type of the function. you can overlead based on the type and number of arguments that this function takes.
참고URL : https://stackoverflow.com/questions/9568852/overloading-by-return-type
'developer tip' 카테고리의 다른 글
Python의 목록에있는 모든 숫자에서 값을 빼시겠습니까? (0) | 2020.11.03 |
---|---|
생성 된 소스 폴더에서 Intellij를 사용할 수 없습니다. (0) | 2020.11.03 |
숭고한 텍스트 또는 다른 텍스트 편집기에서 모든 특수 악센트 문자를 강조 표시하는 방법이 있습니까? (0) | 2020.11.03 |
Google Maps Android API v2-지도에서 터치 감지 (0) | 2020.11.03 |
쿼리 작성기 또는 Eloquent를 사용하여 추가 조건이있는 조인 (0) | 2020.11.03 |