タイプセーフな NxM cross-connectを設計したいと考えています。これは、N 個の関数出力のいずれかを M 個の入力のいずれかに接続できるメカニズムです。または、別の言い方をすれば、(関数のセットからの) 関数の戻り値を別のパラメーターに接続することです。重要な側面は、これらの接続が実行時に構成可能でなければならないということです。私が抱えている主な問題は、各接続に応じて入力のタイプが出力と異なることです。
float foo()
プログラムの任意の時点で、 の戻り値を のパラメータval
に接続したいとしましょうvoid bar(double val)
。
現在、 と という名前の、入力と出力を表す 2 つのパラメーター化されたクラスがありSource<T>
ますDest<U>
。T と U は、float、double、bool、int、unsigned int などであると予想されます。Source<T>
インスタンスの異種コレクションがあり、一部は double、一部は float、一部は int、一部は bool です。インスタンスの異種コレクションもありDest<U>
、一部は double、一部は float、一部は int、一部は bool です。T と U が同じ型の場合もあります。詳細については、これらのインスタンスはすべて一意の名前に関連付けられているため、上位レベルのシステムは「source::foo を dest::bar に接続してください」または「source::red と dest::blue の間の関連付けを削除してください」と言うことができます。 "。
前の例では、コンパイル時に、からの戻り値の型foo()
が float であることがプログラマによって認識され、ソースで指定できるため、 aSource<float>
をインスタンス化してこの関数に関連付けることができます。また、パラメーターの型bar()
も double であるDest<double>
ことがわかっているため、インスタンス化してこの関数に (std::function
ラッパーを使用して) 関連付けることができます。次に、実行時 Source<float>
に に関連付けて、ポリモーフィック ポインターを介して (すべてのインスタンスが共有する継承されたインターフェイスを介して)Dest<double>
に値を伝達できます。次に、ラッパーを使用して関数を呼び出します。Dest<double>
Dest<U>
Dest<double>
bar()
std::function
したがって、実行時の目的は、任意の期間、 anySource
を anyに関連付け、いつでも再関連付けすることです。したがって、実行時にのみ認識される型を、実行時にのみ認識される別の型にDest
変換できる関数を作成する方法が必要です。T
U
少し複雑なことに、戻り値とパラメータ値は実際には任意のサイズの配列である可能性があります。たとえば、配列foo()
を返す可能性がありますが、配列を期待する場合があります (おそらく、4 つの値ごとに 3 つを破棄します)。私の考えは、この「ブリッジ」メカニズムが型変換を処理できるようになると、これを処理するということです。float[32]
bar()
double[8]
率直に言って、これを実装する方法がよくわかりません。ソースと宛先の関連付けがコンパイル時に修正されBridge<T,U>
ていれば、変換を行う一連のテンプレート化された関数を作成できますが、これはすべて実行時に行う必要があるため、それが答えだとは思いません。
ジェネリックBridge<T,U>
関数を作成し、ある種の動的ディスパッチ メカニズムを作成して、T と U に基づいて実行時に適切なものを選択するのが最善の方法ですか? の正しいインスタンスを選択するために、実行時に T と U の型を決定するにはどうすればよいBridge
ですか? また、T と U が同じ型であるケースをキャッチして、不要な変換を (最適化として) 回避したいと考えています。
または、やりたいことを達成するためのより良い方法はありますか?