c++ - supports - Перегрузка по типу возврата




operator<< overloading c++ (6)

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

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

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

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

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

?

https://code.i-harness.com


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

У тебя есть:

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

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

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

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

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


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


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

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

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

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


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

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

  • имя функции
  • CV-классификаторы
  • типы параметров

И вот цитата:

Подпись 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) шаблоны ... перебор в этом случае.


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

Расширьте его на столько типов, сколько вам нужно.


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







overloading