gpt4 book ai didi

c++ - 来自模板参数的继承层次

转载 作者:太空狗 更新时间:2023-10-29 22:57:27 25 4
gpt4 key购买 nike

我需要创建一个类型删除模式,它允许检索所有包含的从给定基类继承的对象。据我所知,像 boost::any 这样流行的类型删除仅在请求的类和包含的类完全匹配时才允许使用 any_cast 检索对象,因此它不符合我的需要。

我可以用模仿模板参数继承关系的模板类来解决这个问题。例如,TemplateClass<Derived>应该是 TemplateClass<Base> 的 child , 这样下面的例子就可以工作了:

// Suppose all clases have virtual destructors so that vtable and RTTI info are available

class ObjectWrapperBase {
}

template<class DataType>
class ObjectWrapperT: public ObjectWrapperBase {
public:
ObjectWrapperBase(T* ptr): dataObjPtr(ptr){}
DataType *dataObjPtr;
}

class Base{}
class Derived: public Base{}
class NotDerivedFromBase{}

int main(){

std::vector<ObjectWrapperBase*> v;
v.push_back(new ObjectWrapperT<Base>(new Base));
v.push_back(new ObjectWrapperT<Derived>(new Derived));
v.push_back(new ObjectWrapperT<NotDerivedFromBase>(new NotDerivedFromBase));

// Now suppose I want to retrieve all the Base and children objects in v
// If ObjectWrapperT<Derived> is a child of ObjectWrapperT<Base> I can write:

for(int i = 0; i < v.size(); i++){
ObjectWrapperT<Base> *wPtr = dynamic_cast<ObjectWrapperT<Base>*>(v[i]);
if(wPtr){
Base *basePtr = wPtr->dataObjPtr;
}
}
}

是否有实现此行为的模式?或者最终是另一种解决方案?谢谢。

最佳答案

您无法完全按照自己的意愿行事,但可以通过模板和运算符获得更接近的结果。
作为一个最小的工作示例:

#include<type_traits>

template<typename D>
struct S {
S(D *d): d{d} {}

template<typename B, typename = std::enable_if_t<std::is_base_of<B, D>::value>>
operator S<B>() {
return {d};
}

private:
D *d;
};

struct B {};
struct D: B {};
struct A {};

int main() {
S<D> sd{new D};
S<B> sb = sd;
// S<A> sa = sd;
}

如果将注释切换到最后一行,它将不再编译,因为 A 不是 B 的基类。

关于c++ - 来自模板参数的继承层次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44023445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com