いくつかの引数を取る関数があり、それぞれが一連の型の 1 つになる場合があります。
すぐ下のコード スニペットのように、これを動的に処理し、失敗した場合は型エラーをスローすることができますが、コンパイル時にこれらの型エラーをキャッチしたいと考えています。
Function specializingFunction(a) As String
Select Case a.GetType
Case GetType(Integer)
Return "INT"
Case GetType(Boolean)
Return "BOOL"
Case Else
Return "__UNKNOWN__" ' or throw an exception
End Select
End Function
Sub mayFail(a1, a2, a3, a4)
Console.WriteLine(specializingFunction(a1))
Console.WriteLine(specializingFunction(a2))
Console.WriteLine(specializingFunction(a3))
Console.WriteLine(specializingFunction(a4))
End Sub
dotNETジェネリックを使用してこの問題を解決したいと思っていました。この質問の最後のコード例を参照してください。
以下のいずれかを喜んで使用します。 1. オープン ソリューション - クライアント コードは、以下の C++ コードのように型の特殊化をさらに追加できます。 ) C++ の Haskell または boost::variant
...しかし、両方の答えを聞きたいです。
#include <string>
#include <iostream>
using namespace std;
string specializedFunction(bool x)
{
return string("BOOL");
}
std::string specializedFunction(int x)
{
return string("INT");
}
template<typename T1, typename T2, typename T3, typename T4>
void correctlyResolves(T1 a1, T2 a2, T3 a3, T4 a4)
{
cout << specializedFunction(a1) << "\n";
cout << specializedFunction(a2) << "\n";
cout << specializedFunction(a3) << "\n";
cout << specializedFunction(a4) << "\n";
}
int main()
{
correctlyResolves(1, true, 3, 4);
return 0;
}
Haskell の例
data X = XInt Int | XBool Bool
descriminator :: X -> String
descriminator (XInt a) = "INT: " ++ show a
descriminator (XBool a) = "BOOL: " ++ show a
lottaArgs :: X -> X -> X -> X -> IO ()
lottaArgs a b c d = do
putStrLn $ descriminator a
putStrLn $ descriminator b
putStrLn $ descriminator c
putStrLn $ descriminator d
main = lottaArgs (XInt 1) (XBool False) (XInt 2) (XInt 3)
私が試した解決策は以下のとおりですが、VBは関数を一般的な形式でインスタンス化しようとしているようです(T1〜T4の型を知らずに)。したがって、VB は「値の型 'T1' を 'Integer' に変換できません」という形式のエラーを返します。
Function specializedFunction(a As Boolean) As String
Return "BOOL"
End Function
Function specializedFunction(a As Integer) As String
Return "INT"
End Function
Sub failsHorribly(Of T1, T2, T3, T4)(a1 As T1, a2 As T2, a3 As T3, a4 As T4)
Console.WriteLine(specializedFunction(a1))
Console.WriteLine(specializedFunction(a2))
Console.WriteLine(specializedFunction(a3))
Console.WriteLine(specializedFunction(a4))
End Sub
Sub Main()
failsHorribly(1, True, 3, 4)
End Sub
VB でこの種の設計上の問題を解決するにはどうすればよいでしょうか? 静的に検証された適切な共用体またはバリアント型はありますか?
許可された型の 1 つだけで構築できるメンバーを使用してカスタム型を作成できると思いますObject
が、これはあまりエレガントではないようです。より良い方法があるはずです。
編集:解決策
ラッパーオブジェクトベースのソリューションの実装については、以下の私の回答を参照してください