为啥函数不能被返回类型重载? [复制]
Posted
技术标签:
【中文标题】为啥函数不能被返回类型重载? [复制]【英文标题】:Why can't functions be overloaded by return type? [duplicate]为什么函数不能被返回类型重载? [复制] 【发布时间】:2011-05-18 22:12:57 【问题描述】:可能的重复:Function overloading by return type?Puzzle: Overload a C++ function according to the return value
因为我有一个库,它以以下形式公开了一堆函数:
bool GetVal();
double GetVal();
int GetVal();
long GetVal();
//So on.
现在我必须包装这些。我宁愿不再重写同一组函数。我想做类似的事情
template<class T>
T GetVal()
但我似乎无法让它工作。有什么想法吗?
【问题讨论】:
除了上面的链接,还有***.com/questions/226144/…等一些 你是说你有一个已经被返回类型重载的库?这听起来不太可能 @jalf:我的猜测是函数在不同的命名空间中。 @Als:也许吧。或者他们实际上有不同的名字。我们不知道,但就目前而言,这个问题意味着他有一个图书馆,它已经做了他说他不能做的事情(而且这是不可能的),然后在这个前提下,他试图完全做某事通过模板专业化可以实现不同(根据T
的类型将通用GetVal<T>()
映射到不同的实现)
【参考方案1】:
您不能重载返回类型,因为在函数调用表达式中使用函数的返回值不是强制性的。
例如,我可以说
GetVal();
编译器现在做什么?
【讨论】:
编译器可能只是发出“Ambiguous return type”消息并拒绝编译。这本身并不足以成为理由。 @Mark Ransom:请在此处有所不同。参考 Stroustrup 的“The C++ Programming Language 3rd Edition”的 $7.4.1 或者:假设我们定义float GetVal()
和double GetVal()
,并写成int x = GetVal();
。怎么办? float
或 double
都可以隐式转换为 int
。
我认为一件事是语言根本不允许这样做,另一件事是为什么不这样做。 “编译器现在做什么?” - 它可能会发出错误,这将是一件好事,因为不使用(或明确忽略)结果可能是一个逻辑错误。至于卡尔的“现在呢?” - 完全相同的推理也可以应用于参数重载:void f(double); void f(float); f(10);
“现在呢?”。这不是重载的前提,它必须是无歧义的。 - 此外,如果您查看链接的问题,返回类型的重载 可以 在 C++ 中模拟。
我想这个参数的更一般形式是“调用函数的结果是否应该取决于调用它的位置?”这似乎是一个危险的原则。如果我调用一个函数F(x)
,无论我是谁、从哪里调用它以及我打算如何处理结果,结果都应该是相同的。【参考方案2】:
函数的返回类型不是编译器生成的用于唯一标识每个函数的名称的一部分。以下各项:
参数个数 参数类型 参数序列是用于为每个函数生成唯一的重整名称的参数。即使名称相同(重载),编译器也可以根据这些独特的错位名称来理解要调用哪个函数。
【讨论】:
即使返回类型被用于名称修饰,如果函数调用的返回值被丢弃,也无法确定要调用的确切函数。 确切地说:名称修改不考虑返回类型的事实是结果,而不是原因。如果标准说它是可能的,那么 name mangling q 将包含返回类型。 @Chubsdad,MSalters:同意,说得好!【参考方案3】:你可以试试
template <typename T> T GetVal(T) ...
代替(使用虚拟变量执行解析)
使用类型转换
或者只使用简单的GetValBool
等。
【讨论】:
template<class T> T GetVal()
和template<typename T> T GetVal()
之间没有区别,问题说第一个不起作用。当然,很高兴知道 nakiya 为何相信这一点,但不问 1. 并没有太大用处。
@ephemient:再看一遍——他传递了一个虚拟参数来使重载工作。【参考方案4】:
C++ 中只有一个函数可以通过返回类型重载,即隐式转换运算符特殊函数,名为 operator T()
(与 T
不同)。
【讨论】:
【参考方案5】:不,不能根据返回类型重载。
来自标准文档,Sec 13.1.2,
— 仅返回类型不同的函数声明不能被重载。
关于你的库,每个函数可能属于不同的命名空间,否则也不可能。
【讨论】:
以上是关于为啥函数不能被返回类型重载? [复制]的主要内容,如果未能解决你的问题,请参考以下文章