gpt4 book ai didi

c++ - 在模板中使用非虚拟分派(dispatch)

转载 作者:行者123 更新时间:2023-11-30 03:06:40 25 4
gpt4 key购买 nike

我想调用一个虚拟的成员函数(在大多数地方都使用继承来使事情简单化),但有时我想在性能关键的地方强制使用非虚拟分派(dispatch)来调用它,在这样的地方确切类型是已知的编译时间。我这样做是出于性能原因,在一个虚拟调用性能很差的平台上。对于大多数功能,虚函数的开销很好,但对于少数功能而言则不然。我想避免将所有功能都复制为虚拟和非虚拟。

例子:

class Interface
{
public:
virtual void Do(){}
};

class Implementation: public Interface
{
public:
virtual void Do(){}
};


void DoIt(Interface &func)
{
func.Do();
};

int main()
{
Implementation a;
DoIt(a);
// can DoIt be constructed as a template to avoid virtual dispatch?
return 0;
}

最佳答案

如果你知道确切的类型,你可以这样做:

template <typename StaticType>
void DoIt(Interface &func)
{
static_cast<StaticType&>(func).StaticType::Do();
};

需要手动向下转换为所需类型的地方(如果您知道类型,static_cast 就可以)。然后你需要限定方法调用,禁用动态调度。

struct DerivedType : Interface {
virtual void Do() { std::cout << "Derived::Do" << std::endl; }
};
struct MostDerived : DerivedType {
virtual void Do() { std::cout << "MostDerived::Do" << std::endl; }
};
void processDerived( Interface & iface ) {
DoIt<DerivedType>( iface );
}
int main() {
MostDerived obj;
DoIt<Derived>( obj ); // Will call Derived::Do
}

请注意,使用限定名称将禁用动态分派(dispatch),这意味着它不会分派(dispatch)到对象的运行时类型,而是分派(dispatch)到您告诉它要调用的类型。

关于c++ - 在模板中使用非虚拟分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386874/

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