我有以下设计问题,某些管理类有一个函数应该允许扩展一组特定类的类并将它们添加到保留该特定集的功能的容器的类。因此,我们有:扩展多个类的C++函数参数
class Base_1 {};
class Base_2 {};
class A :
public Base_1,
public Base_2
{
};
class Container
{
template<typename T> // where T should extend Base_1 and Base_2
void Add(T* pObj) {
elements.push_back(pObj);
}
std::vector<???> elements; // all elements should extend Base_1 and Base_2
};
同样的事情也可能在C#中使用的接口,但我不能找到任何方式在C++来解决这个问题。
我不想因为停止与其中一些经理需要它的元素有基类1和2 3分基类的工作,以创建一个中间类Base_1_2,和另一个经理需要2个和3
所以我问题是,你如何设计这个?
编辑: 回应: “这闻起来像一个XY问题” - cdhowie
我能想象这样的话。所以我会试着解释'X'的问题。
我有一组共享许多功能的类。像“加载到GPU”“渲染”“释放GPU内存”“更新”。但并非所有功能都适用于所有类别。例如,有些可能没有“渲染”。现在我有一个需要存储大量对象的类,并在调用“render”之前检查“load to gpu”是否发生了。但如何实现这一点?如何基于这种功能的组合来存储类(我可能会再次在这里发现'Y')。
编辑2:
类似(但不通用)被cdhowie组成的替代,以下将是一个解决方案吗? (也许留出上添加功能is_base_of)
class MyWrapper
{
public:
template<class T, typename = std::enable_if_t<
std::is_base_of<Base_1, T>::value && std::is_base_of<Base_2, T>::value>>
static MyWrapper MakeWrapper(T* pObj)
{
return MyWrapper(dynamic_cast<Base_1*>(pObj), dynamic_cast<Base_2*>(pObj));
}
Base_1* as_base_1;
Base_2* as_base_2;
private:
MyWrapper(Base_1* p1, Base_2* p2) {
as_base_1 = p1;
as_base_2 = p2;
}
};
class Container
{
public:
template<class T>
void Add(T* pObj) {
elements.push_back(MyWrapper::MakeWrapper<T>(pObj));
}
void Update() {
for (auto& e : elements) {
e.as_base_1->do_1();
e.as_base_2->do_2();
}
}
std::vector<MyWrapper> elements; // all elements should extend Base_1 and Base_2
};
void test() {
A* pA = nullptr;
Container c;
c.Add(pA);
}
这味道像[XY问题](https://meta.stackexchange.com/a/233676/218910)。 – cdhowie
扩展Base_1和Base_2的类的定义是什么? –
根据您的额外解释,有可能的解决方案的实现是丑陋的,但其用法是优雅的 - 您有一个包装类型,确保包装的对象继承你需要的所有类型,* that *就是你存储的在向量中。 – cdhowie