戻り値の型にポリモーフィズムを持つ callable を許可する C に似た言語が見られないのはなぜですか? 追加の型推論がどのようにハードルになるかはわかりましたが、本格的な型推論システム (さまざまなレベルの「作業」で機能する) を備えた言語がたくさんあります。
編集:戻り値の型のポリモーフィズムとは、戻り値の型でのみ関数シグネチャをオーバーロードすることを意味します。たとえば、C++ と Java では、戻り値の型ではなく、仮パラメーターの型でのみオーバーロードが許可されます。
戻り値の型にポリモーフィズムを持つ callable を許可する C に似た言語が見られないのはなぜですか? 追加の型推論がどのようにハードルになるかはわかりましたが、本格的な型推論システム (さまざまなレベルの「作業」で機能する) を備えた言語がたくさんあります。
編集:戻り値の型のポリモーフィズムとは、戻り値の型でのみ関数シグネチャをオーバーロードすることを意味します。たとえば、C++ と Java では、戻り値の型ではなく、仮パラメーターの型でのみオーバーロードが許可されます。
「戻り値の型ポリモーフィズム」とは、戻り値の型に基づいてオーバーロードすることを意味する場合、他の言語についてはわかりませんが、C++ の場合の答えは次のとおりです (ほとんど馬の口から):
関数の戻り値の型がオーバーロードの解決に関与しないのは、Stroustrup (他の C++ アーキテクトからの入力があると思います) がオーバーロードの解決を「コンテキストに依存しない」ことを望んでいたからです。「C++ プログラミング言語、第 3 版」の 7.4.1 - 「オーバーロードと戻り値の型」を参照してください。
その理由は、個々の演算子または関数呼び出しの解決をコンテキストに依存しないようにするためです。
彼らは、結果がどのように使用されたかではなく、オーバーロードがどのように呼び出されたかのみに基づくことを望んでいました (使用された場合)。実際、多くの関数は結果を使用せずに呼び出されるか、結果がより大きな式の一部として使用されます。彼らがこれを決定したときに私が確信している1つの要因は、戻り値の型が解決の一部である場合、複雑なルールで解決する必要があるか、コンパイラにスローさせる必要があるオーバーロードされた関数への多くの呼び出しがあるということでした.呼び出しがあいまいだったというエラー。
そして、ご承知のとおり、C++ のオーバーロードの解決は現状のままでは十分に複雑です...
関数 foo が double または int または string を返すだけでなく、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 クラスの実装を見てください。私見、特定の状況では危険ですが、これは非常に便利なツールです。
型が自動変換されるため、戻り値の型が近い場合にどの関数を呼び出すかが明確ではありません。