組み合わせるとグラフを形成する「頂点」クラスを定義しました。これらの頂点は一方の端で入力を受け取り、もう一方の端で出力を生成します (これらの両側は、この頂点クラスの他のインスタンスの 0、1、またはそれ以上の「サブスクリプション」を持つことができます) 入力データと出力データの両方のタイプは、それぞれに依存しませんこれらの頂点はすべての種類の入力/出力タイプで動作する必要があるため、これらはテンプレート パラメーターとして指定されます。
したがって、コードでは次のようになります。
template<class incomingDataType, class OutgoingDataType>
class Vertex {...}
受信したデータを送信する前に、頂点はフィルター関数を適用してデータを変換/フィルター処理してから、リストのサブスクライバーに再度送信することができます。この関数は、その機能がこの仮想頂点基本クラスから継承する特殊化クラスの種類に依存するため、純粋仮想関数として宣言されます。
これは、フィルターが次のように宣言されていることを意味します。
OutgoingDataType filter(incomingDataType data) = 0;
もちろん、複数の頂点を互いにリンクさせたいと思っています。各頂点の入力と出力が正確に 1 つの他の頂点の入力/出力に接続されている最も単純な形式で、このリンクを検討してください。
(ClassX)vertex1(int) --> (int)vertex2(std::string) --> (std::string)vertex3(OtherClassOrType) -->...
これを念頭に置いて、与えられた例の問題ステートメントは次のように
なります。これらすべてのサブスクリプションを追跡するために、頂点はすべてのパブリッシャーとサブスクライバーへの一連のポインターを保持します。
template<class incomingDataType, class OutgoingDataType>
class Vertex {
....
bool subscribe(Vertex<OutgoingDataType, __DontCareType__>* subscriber);
OutgoingDataType filter(incomingDataType data) = 0;
....
//set of 'outgoing vertices' - whom we provide with data
std::set< Vertex<OutgoingDataType, __DontCareType__>* >subscribers_;
//set of 'incomming vertices' - providing us with data
std::set< Vertex<__DontCareType__, incomingDataType>* >publishers_;
}
サブスクライブする頂点は、着信データ型を発信データ型と一致させる必要がありますが、サブスクライバーの発信データ型は関係ないため、気にしません。パブリッシャーの着信データ型にも同じことが当てはまります。
残念ながら、これを指定する方法がわかりません。クラス テンプレートの代わりに関数テンプレートを使用して (仮想フィルター関数のために動作しません)、boost::any (コンパイルしません)、void ポインター (コンパイルしません) をいじりましたが、何もしませんでした。作品を考えることができます。
要するに、「 DontCareType 」タイプをテンプレート パラメータとして使用する方法を探しています。それが可能であれば、基本的には「「気にしない」とマークするテンプレート パラメータを言う方法です。とにかくそのデータを使用しないため、任意の型にすることができます"
実用的な解決策を得る最後の手段として、一種の「VertexData」型を使用するオプションも検討しています。これは、頂点で使用される着信または発信データ型の基本クラスにする必要があります。これは役に立ちますか?
もちろん、これを実現するための他の提案も大歓迎です。