行列や四元数など、複雑な入力を提供するC++ライブラリを開発しています。私はこれらのタイプを再実装する必要はないので、 は内部的にEigenライブラリを使用します。C++ライブラリのAPIでサードパーティの型を公開する必要があります
私はこれらのタイプをライブラリの クライアントに公開する最良の方法を決定しようとしています。私のAPIにはいくつかのオプションがあります。私は例としてquaternion タイプを使用しますが、これは行列などにも等しく適用できます。また、 私は具体的にEigenのタイプを公開することについて話していますが、この 質問は、使用中の他の外部ライブラリにも同様に適用できます。
1)基本的なタイプ経由でデータを渡すために、クライアントが必要となるだけで、基本的なC++のタイプ
このオプションを使用します。 例えば、クォータニオン(4つの要素)に渡すため、一方が行うことができ:
void my_func(double my_quat[4])
2)固有の型を公開
固有の配列及び四元のためのいくつかのテンプレートの種類を提供します。void my_func(const Eigen::Quaterniond& my_quat)
3)クライアント
のための様々なタイプの単純なラッパーを作成します:関数は四元が必要な場合 たとえば、私は、(本当にQuaternion<double>
のtypedefである)固有の
Quaterniond
タイプを使用することができます
は、私は私のAPIに パスへ クライアントが(おそらくファクトリ関数のいくつかの並べ替えを経由して)を作成しなければならないことを非常に単純な四元タイプ(たとえば、単純な構造体のいくつかの並べ替え)を作成することができます。
void my_func(const quaternion_t& my_quat)
私のライブラリはquaternion_t
のタイプを内部のEigen の表現に変換します。
私は、APIのタイプが であるという強い感覚が欲しいので、オプション1があまりにも好きではありません。オプション2では、 ではなく、 という異なるバージョンのEigenを使用すると、クライアントにEigenも使用する必要があります( の場合、ヘッダーのみのライブラリです)。それはオプション3を残します。
人々はどう思いますか?私は基本的に自分の質問に答えましたか?そこに何かの例がありますか?
関連の質問
関連する質問はhereを頼まれましたが、本当に1 が外部のタイプを公開する必要があるかどうかの詳細には触れませんでした。
オプション3は、オプション1と2の両方を使用するコンストラクタとは何ですか? C++のセマンティクスでは、これを動作させるために宣言型を十分に転送することができます(Eigenを持たないクライアントはヘッダーをインクルードでき、コンパイル時には失敗しません)。 – Lalaland
私はそのようなことについて考えていましたが、typedefされたテンプレート型を宣言する方法についてはあまりあいまいですが、私の場合はクライアントが型の具体的なインスタンスを渡すように制限しています'Quaternion'とは対照的に 'Quaternion 'のように)。 –
plasma
クライアントがコンストラクタを使用してEigen型からライブラリ型を作成していて、若干実装が変更されている可能性のある別のバージョンのEigenを使用している場合に、何が起こるかについては少し曖昧です。 – plasma