Перегрузка по типу возврата

Я читал здесь несколько вопросов по поводу этой темы, которая кажется мне еще более запутанной. Я только начал изучать С++, и я еще не изучал шаблоны или перегрузку оператора и т.д.

Теперь есть простой способ перегрузить

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