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

标签 c++

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

比方说,函数 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/

相关文章:

c++ - 在 C++ 中使用数组仅存储类的数据成员的名称

c++ - 函数可以命名为default吗?

c++ - "is defined"宏检查及其调用必须处于不同的条件下吗?

c++ - 按时间顺序排列的并发消息处理

c# - H264 -> 使用 .NET 的容器

c++ - 不同的实例化方式

c++ - Win32 - 从 C/C++ 中选择目录对话框

c++ - 关于在 S-DES 中实现扩展函数的更有效方法的简单问题

c++ - IID_IDropTarget 和 Virtualtrees::IID_IDropTarget 之间的歧义

c++ - 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows?