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)