Перегрузка по типу возврата
Я читал здесь несколько вопросов по поводу этой темы, которая кажется мне еще более запутанной. Я только начал изучать С++, и я еще не изучал шаблоны или перегрузку оператора и т.д.
Теперь есть простой способ перегрузить
class My {
public:
int get(int);
char get(int);
}
без шаблонов или странного поведения? или я просто
class My {
public:
int get_int(int);
char get_char(int);
}
?
Ответы
Ответ 1
Нет, нет. Вы не можете перегружать методы на основе типа возврата.
Разрешение перегрузки учитывает подпись функции. Функциональная подпись состоит из:
- имя функции
- резюме-классификаторы
- типы параметров
И вот цитата:
1.3.11 подпись
информация о функции, которая участвует в перегрузке (13.3): его список параметров-параметров (8.3.5) и, если функция - член класса, cv-квалификаторы (если есть) для функции себя и класс, в котором объявлена функция-член. [...]
Параметры:
1) измените имя метода:
class My {
public:
int getInt(int);
char getChar(int);
};
2) параметр out:
class My {
public:
void get(int, int&);
void get(int, char&);
}
3) шаблоны... overkill в этом случае.
Ответ 2
Возможно, но я не уверен, что это метод, который я бы рекомендовал для
начинающих. Как и в других случаях, когда вы хотите, чтобы функции
зависит от того, как используется возвращаемое значение, вы используете прокси; сначала определите
функции, такие как 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();
}
};
Расширьте его до такого количества типов, которое вам нужно.
Ответ 3
Нет, вы не можете перегружать по типу возврата; только по типам параметров и константным/летучим квалификаторам.
Альтернативой может быть "возвращение" с использованием ссылочного аргумента:
void get(int, int&);
void get(int, char&);
хотя я бы, вероятно, использовал шаблон или иначе названные функции, как ваш второй пример.
Ответ 4
Вы можете так думать:
У вас есть:
int get(int);
char get(int);
И не обязательно собирать возвращаемое значение функции при вызове.
Теперь вы вызываете
get(10); -> there is an ambiguity here which function to invoke.
Итак, нет смысла, если перегрузка разрешена на основе типа возврата.
Ответ 5
Невозможно перегрузить по типу return в С++. Без использования шаблонов использование get_int
и get_char
будет лучшим, что вы можете сделать.
Ответ 6
Вы не можете перегружать методы, основанные на типах возврата. Лучше всего создать две функции с немного отличающимся синтаксисом, например, во втором фрагменте кода.
Ответ 7
вы не можете перегрузить функцию, основанную на возвращаемом типе функции.
вы можете преодолевать на основе типа и количества аргументов, которые выполняет эта функция.
Ответ 8
В то время как большинство других комментариев по этой проблеме являются технически правильными, вы можете эффективно перегрузить возвращаемое значение , если, вы объедините его с перегрузкой входного параметра. Например:
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) );
}
В результате получается следующее:
I
C