gpt4 book ai didi

c++ - 给定基类方法的编译时覆盖

转载 作者:太空狗 更新时间:2023-10-29 21:31:51 24 4
gpt4 key购买 nike

是否可以有条件地覆盖参数化基类型的派生模板类中的基方法?我的意思是,我有不同的基类,它们包含它们的默认方法定义,我想在编译时定义,我想使用哪个基类以及我想覆盖该类中的哪些方法,传递类似 lambda 函数的东西,那会在重写的实现中被调用。喜欢:

struct BaseOne
{
virtual void f(int& x, const int& y)
{
x += y;
}
};

struct BaseTwo
{
virtual void g(double& x)
{
x += 1.0;
}
};

template<class BaseT/*, method m signature and ID, CallbackT callback*/>
struct Derived: public BaseT
{
/* <mID>(mSignature)> = override
{
callback(<mSignatureArgs...>);
}
*/
// Such that here I do not have to define all methods from BaseT, that could potentially be requested to be overridden at compile-time
};

int main()
{
Derived<BaseOne> d1; // default BaseOne::f definition
Derived<BaseTwo, /* method g, [](double& x) { x += 2; } */> d2; // overridden BaseTwo::g definition
}

编辑:BaseOneBaseTwo 接口(interface)由外部工具生成,它们的接口(interface)不能改变,即它们的接口(interface)方法是多态的,不能依赖于派生类中的特定实现,必须具有相同的公共(public)基类类型(基类中没有模板)和 BaseOne 的所有派生类都像常规多态一样使用:

void doSomethingWithOnes(BaseOne& one)
{
int x = /* get some x */;
int y = /* get some y */;
one.g(x, y); // this call must be virtual
/* use x and y somehow */
}

最佳答案

将它们实现为本地类会容易得多:

int main()
{
class : BaseOne
{
// default BaseOne::f definition
} d1;

class : BaseTwo
{
// overridden BaseTwo::g definition
void g(double& x) override
{
x += 2;
}
} d2;
}

这些可以使用与 lambda 可以使用的完全相同的东西,并且更加清晰,同时仍然在接近它们使用的地方定义。

关于c++ - 给定基类方法的编译时覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986809/

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