gpt4 book ai didi

c++ - 检查传递的类型接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:40 25 4
gpt4 key购买 nike

我有以下接口(interface):

struct Base {};

struct Renderable {};
struct Updateable {};

类像这样使用它:

class Foo1 : Base {};
class Foo2 : Base, Renderable {};
class Foo3 : Base, Renderable, Updateable {};

有一个函数接受这些类型的对象:

template <typename T>
void add(T* obj)
{
// Object inherits Renderable interface
if (static_cast<Renderable*>(obj))
...

// Object inherits Updateable interface
if (static_cast<Updateable*>(obj))
...
}

当我传递 Foo1 类型的对象时,这不起作用。这样做的正确方法是什么?

最佳答案

static_cast<T>()不检查运行时类型信息; dynamic_cast<T>()做。您需要替换 static_castdynamic_cast , 并在编译代码时启用运行时类型信息 ( RTTI )(如果编译器默认关闭它)。您需要确保 Base至少有一个虚函数。

请注意,通常这不是一个非常稳健的设计,因为您的 add()当您将另一种类型添加到层次结构时,函数可能会中断。更好的方法是实现 visitor patternBase和执行 add 的代码.

这里是你如何做到的:

struct Visitor {
virtual void visitFoo1(Foo1 &foo1);
virtual void visitFoo2(Foo2 &foo2);
virtual void visitFoo3(Foo3 &foo3);
};
struct Base {
virtual void accept(visitor& v);
...
};
struct Foo1 : public Base {
virtual void accept(visitor& v) {
visitFoo1(*this);
}
...
};
struct Foo2 : public Base {
virtual void accept(visitor& v) {
visitFoo2(*this);
}
...
};
struct Foo3 : public Base {
virtual void accept(visitor& v) {
visitFoo3(*this);
}
...
};

现在有 add 的代码函数可以做到这一点:

struct FooProcessor : public visitor {
virtual void visitFoo1(Foo1 &foo1) {
...
}
virtual void visitFoo2(Foo2 &foo2) {
...
}
virtual void visitFoo3(Foo3 &foo3) {
...
}
void add(Base &b) {
b.accept(*this);
}

}

当您调用 accept 时在 Base 的实例上, 它回调 visitFooN 之一功能,使 RTTI 变得不必要。

关于c++ - 检查传递的类型接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23194782/

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