2

これは前の質問へのフォローアップです。

クライアントが行列や四元数などの複雑な型を提供する必要があるライブラリを開発しています。内部的には、Eigenを使用してこれらの型を操作し、リンクされた質問の議論に基づいて、おそらく Eigen の型の周りに薄いラッパーを配置し、クライアントにそれらの型をライブラリに提供するように依頼し、本質的に Eigen を内部実装の詳細。

実際、私のクライアントの一部はすでに Eigen を使用している可能性があるため、Eigen の型のラップされたバージョンで Eigen 関数との間である種の機能を提供するよう提案されました。

それはすべて問題ないように思えますが、私のライブラリがクライアントが使用しているバージョンとは異なるバージョンの Eigen を内部で使用している場合にどうなるか心配です。2 つのバージョンが ABI 互換であれば、何の問題もありません。ただし、そうでない場合は、「悪い」ことが起こっていると想像できます。Eigen はヘッダーのみのライブラリであり、たとえば、私のライブラリとクライアントがすべて同じコンパイル済みバージョンのサードパーティ ライブラリにリンクするとは想定できないため、特に心配しています。

ユーザーにソース コードを提供し、Eigen に対してコンパイルしてもらう場合、あまり心配する必要はありません。しかし、私が最も懸念しているのは、ユーザーのために DSO/DLL をコンパイルしてインストールする場合です。

ですから、私の質問は次のとおりだと思います: クライアントが ABI 互換バージョンのライブラリを使用するように制限する必要がありますか? Eigen に必要なヘッダーを提供することはできますが、ユーザーが既に Eigen を使用していると問題が発生します。

ラッパー型への必要な変換をクライアントに任せることができると思いますが、便利な関数を提供したいと思います。

特に Eigen について話していますが、この質問は型を提供するサードパーティのライブラリにも当てはまる可能性があることに注意してください。

ありがとう!

4

1 に答える 1

2

独自の型を提供することは間違いなく最も普遍的なアプローチであり、人々がサードパーティのライブラリ (つまり Eigen) を使用する場合と使用しない場合で、ライブラリを使用できるようにします。クライアントが使用する可能性のあるすべてのサードパーティ ライブラリをカバーすることは決して期待できないため、変換関数はエンドユーザー/実装者に任せることをお勧めします。

変換/便利な関数を提供することが非常に重要な場合は、それらを別のソース ファイルに実装し、クライアントに直接提供してください。あなたが気にかけていることを示すために、少し砂糖でコーティングします。

余談ですが、利用可能な場合は常に「標準」構造を使用したいと思います。STLには「マトリックス」または「四元数」のデータ型がないことは知っていますが、Boostあります.Boostは、実際に標準に含まれていなくても標準に近づくことができます. それはあなたにもう1つの可能性を提供します。

于 2012-05-14T19:25:08.873 に答える