gpt4 book ai didi

c++ - 如何绕过模板化成员函数不能为虚函数的限制进行设计

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:14 27 4
gpt4 key购买 nike

我遇到了一个设计问题(在 C++ 中),我希望(非模板类的)模板化成员函数是虚拟的,并且想知道是否有一个好的、优雅的方法来解决这个问题。

场景是这样的,我有机器可以处理通用项目。我为 机器 使用了一个抽象基类,带有一个虚拟的 process(Item) 函数,这样每台机器都可以定义自己独特的处理方法。问题在于这些项目也是“通用的”,因为它们公开了特定的接口(interface)以供处理。出于某些原因(主要是为了性能......没有 vtable 开销),我想对这些项目使用编译时多态性。这样现在每台机器都会有一个像这样的界面:

class Machine
{ public:
template <typename T>
virtual void process(T& item) = 0;
};

然而,这在 C++ 中是不可能的,因为模板化的成员函数不能是虚函数。当然,我可以使机器类在 Item 类型 T 上模板化,但这在更大的设计方案中让我更加头疼,而且 Machine 类的其他部分实际上没有依赖于 Item ...它只是 process() 函数的一个参数.

是否有更好的解决方法或关于如何提供处理通用项目系列(其中项目使用编译时多态性)的此类通用机器系列的任何建议。就我的设计而言,我是否已经走到尽头了。

感谢任何建议

最佳答案

通常使用双重分派(dispatch)。

class Machine;
class Item {
public:
virtual void bounce(Machine& mach);
};
class Machine {
public:
template<typename T> void process(T& t);
virtual void process(Item& i) {
return i.bounce(*this);
}
};
template<typename T> class CRTPItem {
public:
virtual void bounce(Machine& mach) {
return mach.process(*(T*)this);
}
};
class ConcreteItem : public CRTPItem<ConcreteItem> {
public:
// blah blah
};

在这种情况下,您不需要整个 ConcreteItem 接口(interface)的虚拟开销,并且它们不需要任何共同点,只需要一个通过继承自动为您构建的 bounce 函数来自 CRTPItem。这只是两个 vtable 调用,而不是你最初的调用,而不是需要一个 vtable 调用来调用 Item 的所有功能,并且接口(interface)仍然可以保留所有强类型,如果你可以创建虚拟模板。

关于c++ - 如何绕过模板化成员函数不能为虚函数的限制进行设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15592424/

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