Перегрузка по возвращаемому типу
Я прочитал здесь несколько вопросов по этой теме, которая кажется мне еще запутанной. Я только начал изучать C++, и я еще не изучал шаблоны или перегрузку операторов и т. д.
теперь есть простой способ перегрузки
class My {
public:
int get(int);
char get(int);
}
без шаблонов или странное поведение? или я должен просто
class My {
public:
int get_int(int);
char get_char(int);
}
?
8 ответов:
нет. Нельзя перегружать методы, основанные на тип возвращаемого значения.
разрешение перегрузки учитывает подпись функции. Сигнатура функции состоит из:
- имя функции
- 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);
и, это не обязательно, чтобы собрать возвращаемое значение функции при вызове.
теперь, вы вызовете
get(10); -> there is an ambiguity here which function to invoke.
итак, нет смысла, если перегрузка разрешена на основе возвращаемого типа.
в C++нет способа перегрузки по типу возврата. Без использования шаблонов, используя
get_int
иget_char
будет лучшее, что вы можете сделать.
вы не можете перегружать методы, основанные на возвращаемых типах. Лучше всего создать две функции с немного другим синтаксисом, например, во втором фрагменте кода.
хотя большинство других комментариев по этой проблеме технически корректны, вы можете эффективно перегрузка возвращаемого значения если вы объединяете его с перегрузкой входного параметра. Например:
class My { public: int get(int); char get(unsigned int); };
демо:
#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) ); }
результатом этого является:
I C