如果你需要这样的东西,你会怎么做?
比方说,函数 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/