Перегрузка по типу возврата - PullRequest
66 голосов
/ 05 марта 2012

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

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

class My {
public:
    int get(int);
    char get(int);
}

без шаблонов или странного поведения? или я должен просто

class My {
public:
    int get_int(int);
    char get_char(int);
}

Ответы [ 8 ]

89 голосов
/ 05 марта 2012

Нет, нет.Вы не можете перегружать методы на основе типа возвращаемого значения.

Разрешение перегрузки учитывает сигнатуру функции .Подпись функции состоит из:

  • имени функции
  • 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) шаблоны ... в этом случае излишни.

74 голосов
/ 05 марта 2012

Возможно, но я не уверен, что эту технику я бы порекомендовал новичкам.Как и в других случаях, когда вы хотите, чтобы выбор функций зависел от того, как используется возвращаемое значение, вы используете прокси;сначала определите функции, такие как 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();
    }
};

Расширьте его до необходимого количества типов.

8 голосов
/ 05 марта 2012

Нет, вы не можете перегружать типом возвращаемого значения;только по типам параметров и квалификаторам const / volatile.

Одной из альтернатив будет «возврат» с использованием ссылочного аргумента:

void get(int, int&);
void get(int, char&);

, хотя я, вероятно, буду использовать шаблон или по-другомуназванные функции, как ваш второй пример.

4 голосов
/ 12 июля 2013

Вы можете думать так:

У вас есть:

  int get(int);
  char get(int);

И не обязательно собирать возвращаемое значение функции при вызове.

Теперь вы вызываете

  get(10);  -> there is an ambiguity here which function to invoke. 

Итак, нет смысла, если перегрузка разрешена на основе типа возвращаемого значения.

2 голосов
/ 04 декабря 2015

Хотя большинство других комментариев по этой проблеме технически правильны, вы можете эффективно перегрузить возвращаемое значение , если , вы объедините его с перегрузкой входного параметра. Например:

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
2 голосов
/ 05 марта 2012

Вы не можете перегружать методы, основанные на типах возвращаемых данных. Лучше всего создать две функции с немного отличающимся синтаксисом, например во втором фрагменте кода.

2 голосов
/ 05 марта 2012

В C ++ нет способа перегрузки по типу возвращаемого значения.Без использования шаблонов лучше всего использовать get_int и get_char.

0 голосов
/ 05 марта 2012

Вы не можете перегрузить функцию, основываясь на типе возврата функции.вы можете переопределить в зависимости от типа и количества аргументов, которые принимает эта функция.

...