web-dev-qa-db-ja.com

汎用データ構造は、自己完結型プログラムでの使用に慣習的なものですか、それともソースファイルを複製できますか?

グラフでダイクストラ検索を行うプロジェクトがあり、ノードに使用する赤黒ツリーと優先度キューを実装しましたが、エッジなどの他のものにも同じデータ構造が必要です。おそらく2つだけ、おそらく3つのタイプの構造体を一緒に使用すると思います。

構造体 'タイプ'が最初からわかっているようなシナリオでは、void *を使用してコンパレーターに関数ポインターを渡す必要がありますか、それともタイプセーフを維持するためにソースファイルを複製することは私が守れるスタンスだと思いますか?

私は、この種の設計上の決定を直感するのに十分なほどCを掘り下げる機会がなかったので、どんな助けにも感謝します。

3
Materia Gravis

コンテナーに格納される型がわかっていて数が少ない場合は、実際に両方の型の安全性を確保できますand重複なし。

まず、void*を使用してストレージやコールバック関数をポイントし、比較などを行う、汎用コンテナーを作成します。次に、ジェネリックコンテナーの周りに型固有のラッパーを記述し、残りのコードからそれらを使用します。

書くラッパーが多い場合、これは面倒になりますが、2つまたは3つで面倒なことはありません。