私が取り組んでいるプロジェクトは、GMP、OpenSSLなどのさまざまな多数のライブラリ間で簡単に交換できる可能性があることから恩恵を受ける可能性があります。現在の実装では、必要なすべての演算子を実装するテンプレート抽象基本クラスを定義しています(いくつかの構文糖衣)と私は必要な純粋仮想関数を定義します。
ライブラリごとに、次のような派生クラスがありますclass BigNumberGmp : public BigNumberBase<BigNumberGmp>
。私はそれがちょっとOOPを壊すことを知っていますが、C ++共分散機能は制限が厳しすぎて、メソッドからBigNumberBaseオブジェクトを返すことはできず、参照のみを返すことができます。これは非常に望ましくありません...
問題は、カスタムラッパーを使用するコードがBigNumberGmp、BigNumberOpenSslなどのラッパーで動作できるようにすることです。これを実現するために、typedef BigNumberGmp BigNumberを定義し、条件付きマクロ内に配置しました。 :
#if defined(_LIB_GMP)
typedef BigNumberGmp BigNumber;
#endif
また、同様の方法で適切なヘッダーを含めます。この実装では、コンパイラオプションで_LIB_GMPシンボルを定義する必要があります。
ご覧のとおり、これはかなりハックなテクニックであり、私はあまり誇りに思っていません。また、特殊なクラス(BigNumberGmp、BigNumberOpenSslなど)を非表示にすることもありません。_LIB_XXX条件付きマクロでラップされたBigNumberクラスを複数回定義することも、_LIB_XXX条件付きマクロでラップされたライブラリごとにBigNumberクラス内に必要なメソッドを複数回実装することもできます。後者の2つのアイデアは、typedefの実装よりもさらに悪いように見え、同じ名前のアイテムが複数ある理由を理解できないため、doxygenの出力を確実に台無しにします。私はまだ_LIB_XXXの定義に依存しているので、doxygenプリプロセッサの使用を避けたいです...
代わりに使用できるエレガントなデザインパターンはありますか?そのような問題にどのように取り組みますか?