developer tip

반환 유형별 오버로딩

copycodes 2020. 11. 3. 08:17
반응형

반환 유형별 오버로딩


나는 아직 나에게 혼란스러워 보이는이 주제에 대해 몇 가지 질문을 읽었습니다. 저는 방금 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

반응형