2つのプロジェクトがあるとします。 1つはアプリケーションであり、もう1つはこのアプリケーション以外で使用できる共通の再利用可能なコードを含む共有ライブラリです。共有ライブラリ境界を中心としたC++インターフェイスの設計
私のアプリケーションはSTLを使用し、共有ライブラリはSTLも使用します。ここでの最初の問題は、共有ライブラリがSTLを使用していることです。アプリケーションに新しいバージョンのSTLをビルドしても、必要でないため共有ライブラリを再構築しないと、すぐに互換性の問題が発生します。
この問題を解決する私の最初の考えは、共有ライブラリクラスへのインターフェイスでSTLをまったく使用しないことです。私たちのライブラリに、文字列を受け取り、何かを行う関数があるとします。 、これはおそらく、STLの異なるバージョン間でOKになりますが、欠点は、我々はstd::string
から行っているということである文字列の場合
void DoStuffWithStrings(std::string const& str);
:
void DoStuffWithStrings(char const* str);
の代わりに:私のような関数プロトタイプを見てになるだろうchar*
に戻り、std::string
に戻って、パフォーマンスの問題を引き起こすようです。
STL対応の生のタイプのボクシング/アンボッティングは推奨されていますか?私たちがstd::list
にこれをしようとすると、これはさらに悪化します。なぜなら、何らかのO(n)または同様の操作をしなくても簡単に渡すことができることを知っている「生の型」は実際には存在しないからです。
このシナリオではどのようなデザインが最適ですか?それぞれの長所と短所は何ですか?
Cとの互換性は唯一の関心事ではなく、親指IMHOの非常に良いルールではありません。あなたが言うように、共有ライブラリが常にアプリケーションでビルドされることを保証するものではないが、Cによってまったく使用されない場合、互換性の問題を考慮する必要があります。 C++は(.NETやC#のようなものに比べて)非常に弱い共有ライブラリサポートを持っているので、要件にかかわらず、互換性が問題になることはありません。 'std :: vector'と' std :: map'では、どういうわけかそれらをユーザー型にマップすることができます。 –
はい条件はもっと「Cを必要とせず、すべてのライブラリを制御できたら」のようになります。 – stijn