【发布时间】:2013-03-06 19:13:48
【问题描述】:
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)
【问题讨论】:
-
这是否是一件好事完全取决于您要解决的问题,而您已经忽略了。也就是说,你一开始为什么会出现这种情况?
-
@GManNickG 我添加了更多关于我的具体问题的信息,解释了我是如何陷入这种情况的。
标签: c++ boost c++11 delegates polymorphism