Перегрузить функцию C ++ в соответствии с возвращаемым значением - PullRequest
33 голосов
/ 22 октября 2008

Мы все знаем, что вы можете перегрузить функцию в соответствии с параметрами:

int mul(int i, int j) { return i*j; }
std::string mul(char c, int n) { return std::string(n, c); } 

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

int n = mul(6, 3); // n = 18
std::string s = mul(6, 3); // s = "666"
// Note that both invocations take the exact same parameters (same types)

Можно предположить, что первый параметр находится в диапазоне 0-9, нет необходимости проверять ввод или обрабатывать ошибки.

Ответы [ 17 ]

0 голосов
/ 14 мая 2010

ОК, вы, гении;) Вот как вы делаете это как профессионал.


class mul
{
 int m_i,m_j;
public:
 mull(int i,int j):m_i(i),m_j(j){}
 template
 operator R() 
 {
  return (R)m_i * m_j;
 }
};

используйте как


double d = mul(1,2);
long l = mul(1,2);

не глупо <>

0 голосов
/ 22 октября 2008

Насколько я знаю, вы не можете (правда, очень жаль ...). В качестве обходного пути вы можете вместо этого определить параметр out и перегрузить его.

0 голосов
/ 22 октября 2008

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

0 голосов
/ 22 октября 2008

Поместить его в другое пространство имен? Вот как бы я это сделал. Не просто перегрузка, а просто наличие двух методов с одинаковым именем, но с другой областью действия (отсюда и оператор разрешения области действия).

Итак, stringnamespace :: mul и intnamespace :: mul. Возможно, это не совсем то, о чем вы просите, но, похоже, это единственный способ сделать это.

0 голосов
/ 22 октября 2008

Вы можете использовать решение функтора выше. C ++ не поддерживает это для функций, кроме const. Вы можете перегружать в зависимости от const.

0 голосов
/ 22 октября 2008

Нет в C ++. То, что вы получите в приведенном выше примере, будет возвращаемым значением, которое представляет собой тип int для чего-то, что string может понять, скорее всего, char. Это будет ASCII 18 или «управление устройством 2».

0 голосов
/ 22 октября 2008

Вы могли бы сделать что-то вроде

template<typename T>
T mul(int i,int j){
    return i * j;
}

template<>
std::string mul(int i,int j){
    return std::string(j,i);
}

А потом назовите это так:

int x = mul<int>(2,3);
std::string s = mul<std::string>(2,3);

Нет способа перегрузки возвращаемого значения.

...