1

いくつかの引数を取る関数があり、それぞれが一連の型の 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が、これはあまりエレガントではないようです。より良い方法があるはずです。

編集:解決策

ラッパーオブジェクトベースのソリューションの実装については、以下の私の回答を参照してください

4

1 に答える 1