X:関連のないさまざまな種類のオブジェクトを処理する、関連のないコンテナーのようなオブジェクト (ベクター、マップ、ツリーなど) のコレクションがあります。これらのコンテナー内のオブジェクトの有効期間は、コンテナーの一部のサブセット間で共有されます。それらの同期を担当するオブジェクトがあります。私が考えることができる同期クラスの最も単純な実装は、私が管理したいすべてのコンテナーのようなオブジェクトに共通のインターフェイスを実装するクラスになるBaseContainerLike
ポインターのベクトルを持つことです。BaseContainerLike
しかし、それらのすべてがコンテナのようなわけではありません。それらはコンテナのように使用できますが、共通の基本クラスから継承することは非常に奇妙に感じられ、私のデザインが非常に強く結合されるのではないかと心配しています.
だから私はContainerLikeInterface
このようなクラスを作成しました:
struct ContainerLikeInterface {
template<T>
ContainerLikeInterface(T& t)
: create([](int i){ return t->create(i); }), // this is just an example
delete([](int i){ return t->delete(i); }) {}
std::function<void(int)> create;
std::function<void(int)> delete;
};
template<class T>
ContainerLikeInterface make_containerLikeInterface(T& t) {
return ContainerLikeInterface(t);
}
これにより、邪魔にならない方法でインターフェースのベクトルを自明に作成できます (コンストラクターをさまざまな型に部分的に特化することができます)。このアプローチを使用したコードは、継承を使用した場合よりもわずかに高速ですが、必要なメモリがわずかに多くなり、コンパイル時間が長くなります (ただし、コンパイル時間は優先しません)。ただし、このアプローチが私のプロジェクトにうまく適合するかどうかはわかりません。また、人々がオブジェクトの所有権をインターフェイスに移すことを好む値セマンティクスに関する記事をいくつか読んだので、次の質問があります。
- このアプローチの長所/短所は何ですか?
- これは長期的に私にいくつかの問題を与えるでしょうか?
- 代わりに継承を使用する必要がありますか?
- これを別の方法で実装する必要がありますか?
- 代わりにライブラリを使用する必要がありますか? ( boost::TypeErasure、adobe::poly、またはpyrtsa/poly )