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


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

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

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

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

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

?

8 62

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

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