gpt4 book ai didi

具有镜像层次结构的 C++ 双重分派(dispatch)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:16 25 4
gpt4 key购买 nike

以下类层次结构表示抽象资源处理程序和资源层次结构。两者都将接口(interface)作为基类。现在想象你写了一个系统,你可以在这些接口(interface)下实现多个特定的资源系统。这里只是一个例子。特定的主类创建从 stuff 派生的资源。现在,当创建的资源被传递给基接口(interface)时,它作为指向基资源类的指针传递,但我想处理特定资源并访问其特定属性。

我知道双重分派(dispatch),但我认为它在这种情况下不起作用。我想阻止 RTTI 和 dynamic_casts。您对处理此类案件有何建议?

class resource;

class main_resource_handler
{
public:
virtual resource* create_resource() = 0;
virtual void do_some(resource* st) = 0;
};

class resource
{
};

class specific_resource : public resource
{
public:
int i;
};

class specific_resource_handler : public main_resource_handler
{
public:
stuff* create_resource) {
return new specific_resource);
}
void do_some(resource* st) {
// in here i want to work with specific resource
}
void do_some(specific_resource* st) {
// i want to get here
}
}

main_resource_handler* handler = new specific_resource_handler();
resource* res = handler->create_resource();
handler->do_some(res); /// here

最佳答案

我认为你没有问对问题。

要完成您的要求,您只需添加以下内容:

template<typename T>
class helper : public main_resource_handler
{
public:
virtual resource* create_resource() { return new T; }
virtual void do_some(resource* st) { do_some_specific(static_cast<T*>(st)); }
private:
virtual void do_some_specific(T* st) = 0;
};

然后改变这个:

class specific_resource_handler : public helper<specific_resource>
{
private:
virtual void do_some_specific(T* st) { ... }
}

static_cast 仅在您可以保证始终对正确类型的处理程序调用 do_some 时才是安全的。但是如果您已经知道它是正确的处理程序类型,那么就没有必要进行基类方法调用。所以大概你想要的是获取某种 resource,不知道它的确切类型,并将它传递给适当的处理程序。这更棘手......

关于具有镜像层次结构的 C++ 双重分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2351736/

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