通过返回types重载

我在这里读到几个关于这个话题的问题,这个问题似乎让我感到困惑。 我刚刚开始学习C ++,还没有学习模板或者运算符重载等。

现在有一个简单的方法来重载

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

没有模板或奇怪的行为? 或者我应该只是

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

没有没有。 您不能基于返回types重载方法。

重载parsing考虑到函数签名 。 function签名由以下部分组成:

  • 函数名称
  • CV-预选赛
  • 参数types

这里是引用:

1.3.11签名

有关参与重载parsing(13.3)的函数的信息:参数types列表(8.3.5),如果函数是类成员,函数本身的cv-qualifiers(如果有的话)和类在其中声明了成员函数。 […]

选项:

1)改变方法名称:

 class My { public: int getInt(int); char getChar(int); }; 

2)输出参数:

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

3)模板…在这种情况下矫枉过正。

这是可能的,但我不确定这是一个我build议初学者的技术。 和其他情况一样,当你想要select函数来取决于返回值的使用方式时,你可以使用代理; 首先定义像getChargetInt这样的函数,然后返回一个像这样的代理的通用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(); } }; 

根据需要将其扩展到多种types。

不,你不能通过返回types重载; 只有参数types和const / volatile限定符。

另一种select是使用参考参数“返回”:

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

尽pipe我可能会使用一个模板,或者像第二个例子那样命名不同的函数。

你可以这样想:

你有:

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

而且,调用时不一定要收集函数的返回值。

现在,你调用

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

所以,基于返回types,允许重载是没有意义的。

在C ++中无法通过返回types进行重载。 不使用模板,使用get_intget_char将是最好的。

您不能基于返回types重载方法。 最好的办法是创build两个稍微不同的语法的函数,比如在你的第二个代码片段中。

你不能根据函数的返回types重载一个函数。 你可以根据这个函数的参数types和数量来重载。

虽然大多数关于此问题的其他评论在技术上是正确的,但如果将其与过载input参数结合使用,则可以有效地重载返回值。 例如:

 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) ); } 

由此产生的是:

 IC