通过返回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函数来取决于返回值的使用方式时,你可以使用代理; 首先定义像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(); } };
根据需要将其扩展到多种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_int
和get_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