gpt4 book ai didi

c++ - 根据条件类型转换为不同的类

转载 作者:行者123 更新时间:2023-11-28 04:10:40 25 4
gpt4 key购买 nike

如果你需要这样的东西,你会怎么做?

比方说,函数 foo 接受一个 void*。

void foo(void* param);

根据条件,foo 的内部函数定义将被类型转换为类 ABC 指针或类 DEF 指针。像这样:

void foo(void* param) {
if (condition) {
ABC* abc = (ABC*) param;
} else {
DEF* abc = (DEF*) param;
}

// Irrespective of abc type, need to use abc quite a bit here. Such as abc->func1() etc.
// So, abc should be made local to foo instead of the condition to use it later.
}

您一般如何解决这个问题?模板可能是一种方式。

最佳答案

foo 的参数可以以某种方式制作,它是指向基类的指针,基类具有接口(interface)类型的整数。

将参数转换为基类指针,即可获取接口(interface)类型。

然后你可以把它变成一个 switch(interface_id) 或者类似的东西。

警告:代码未经测试,只是从脑海中写出来的

例子:

class Base_Class
{
public:
uint16_t interface_id=0;
}

class Derived_1 : public Base_Class
{
public:
Derived_1() : Base_Class(), interface_id(1)
{

}
}

class Derived_2 : public Base_Class
{
public:
Derived_2() : Base_Class(), interface_id(2)
{

}
}

现在将 foo 的参数转换为基指针:

void foo(void* param) {
if (!param)
return;
Base_Class * b = static_cast<Base_Class*>(param);
uint16_t interfaceID = b->interface_id;
switch (interfaceID)
{
case 1:
Dervided_1* c1 = static_cast<Derived_1*>(b); break;
case 2:
//...
}
}

在处理固定使用空指针(回调等)的 C API 时,我经常使用这种方法。这可能不是最流畅的方式,但对于相当多的人来说似乎很容易理解。这部分使其易于维护。

其他变体可能会动态转换基指针并检查结果。或者,如果您在派生类中覆盖虚方法,则可以以正确的方式使用它们。

记住:如果你有一个 void 指针,你不能直接执行动态转换,所以先转换为基指针,然后再执行动态转换。

这只是正确方向的提示,请不要将其用作“复制粘贴”答案

关于c++ - 根据条件类型转换为不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867242/

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