为什么我们看不到允许在返回类型中具有多态性的可调用对象的类 C 语言?我可以看到额外的类型推断将如何成为一个障碍,但我们有很多具有成熟类型推断系统的语言(适用于不同级别的“工作”)。
编辑:通过返回类型多态性,我的意思是仅在返回类型中重载函数签名。例如,C++ 和 Java 只允许在形式参数的类型中重载,而在返回类型中不允许重载。
为什么我们看不到允许在返回类型中具有多态性的可调用对象的类 C 语言?我可以看到额外的类型推断将如何成为一个障碍,但我们有很多具有成熟类型推断系统的语言(适用于不同级别的“工作”)。
编辑:通过返回类型多态性,我的意思是仅在返回类型中重载函数签名。例如,C++ 和 Java 只允许在形式参数的类型中重载,而在返回类型中不允许重载。
如果“返回类型多态性”是指基于返回值类型的重载,我不确定其他语言,但对于 C++,这是答案(几乎来自马的嘴):
函数返回类型不会仅仅因为 Stroustrup(我假设来自其他 C++ 架构师的输入)希望重载决策是“上下文无关的”而在重载决议中发挥作用。请参阅“C++ 编程语言,第三版”中的 7.4.1 - “重载和返回类型”。
原因是保持单个运算符或函数调用的分辨率与上下文无关。
他们希望它只基于重载的调用方式——而不是结果的使用方式(如果它被使用的话)。事实上,许多函数在调用时不使用结果,或者结果将用作更大表达式的一部分。当他们决定这样做时,我肯定会发挥作用的一个因素是,如果返回类型是解决方案的一部分,则会有许多对重载函数的调用,这些函数需要使用复杂的规则来解决,或者必须让编译器抛出调用不明确的错误。
而且,天知道,C++ 重载解析就目前而言已经足够复杂了……
我很想在某些语言中看到这个特性,不仅让函数 foo 可以返回一个 double 或一个 int 或一个字符串,而且让 foo 可以返回一个结构或不同类的对象。消除歧义调用将是相当微不足道的 - 如果调用不明确,则需要强制转换来选择所需的返回类型。例子:
string s = foo(); //foo returns a string
double x = foo(); //foo returns a double
int i = foo(); //foo returns an integer
float f = (float)(int)foo(); //call the int foo and convert to float
此外
Animal a = fooFactory(); //fooFactory returns an Animal
Plant p = fooFactory(); //foofactory returns a Plant
这些情况并不经常出现,但是当他们这样做时,解决方法通常是相当难看的......
double x = (double)foo();
如果存在可以返回 double、int、float 等的 foo() 版本,则上述内容不明确。
在 C++ 中,您可以在很大程度上使用类来做到这一点。例如,假设我有一个数据类型,它在输入和输出时通常会转换为 ASCII;
typedef char* pchar;
class MyType
{
public:
operator pchar() { return(ConvertToASCII()); }
MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }
pchar ConvertToASCII();
void ConvertFromASCII(pchar ASCII);
}
这类东西经常用在 C++ 框架中。例如,看看 MFC CString 类的实现。恕我直言,这是一个非常有用的工具,尽管在某些情况下很危险。
由于类型的自动转换,当返回类型接近时,不知道要调用哪个函数。