C++:在基类中使用带有泛型虚函数的异步回调

标签 c++ generics inheritance

目前我正在编写一个 C++ 程序,它应该包含一个非常通用的基类。其中会有一些 protected 功能

class Base{
     virtual void doA() = 0;
     virtual void doB() = 0;
     \\[see below]...
}

它们将异步执行,并在它们完成后立即调用它们作为回调:

 virtual void doACallback(type1 param1, type2 param2) = 0;
 virtual void doBCallback() = 0;

我的问题是 doAdoB 的实现对于每个子类都是不同的,回调方法应该能够接收不同的参数(类型和数字) .是否可以在基类中保留回调方法声明的同时进行管理?也许这可以通过另一种方式来实现。我还是 C++ 的新手。

注意:Base 不仅仅包含纯虚函数。

编辑:因为有人问。我想定义子类的一般“外观”。我的具体场景非常复杂,但让我们尝试一个例子:

class Base{
  virtual void sendData() = 0;
  virtual void sendDataCallback() = 0;
}

class SubclassA:public Base{    
  void sendData() override{
       //send Data by using LibraryA
  }
  void sendDataCallback(ErrorCode aErrorCode) override{
     //handle error Code
  }    
}

class SubclassB:public Base{
  void sendData() override{
       //send Data by using LibraryB
  }
  void sendDataCallback(ErrorCode aErrorCode, Response aResponse) override{
     //handle error Code and handle response
  }    
}

这不是确切的场景,但也许这澄清了这个想法......

编辑 2:如果有人想知道:最后我选择在子类中定义回调。

最佳答案

几乎任何事情都是可能的。您可以转换为 void* 并返回派生类:

struct ScrewThis
{
    void addCallback(void * cb) { callbacks.push_back(cb); }
    void executeCallback(int index) const = 0;

    std::vector<void*> callbacks;
};

struct TotalHell : ScrewThis
{
    void executeCallback(int index) const
    {
        auto callback
             = static_cast<std::function<int(int,int)> const*>(callbacks[index]);

        auto i = callback(4,2);
        //...
     }
};

但是你到底为什么要这么做?这是维护的噩梦。其他开发者会看到它并立即想自杀……或者你……或者更可能是两者。

您这样做只是为了共享“通用”代码(“通用”用引号引起来,因为如您所见,它不是通用代码)。 OOP 早期犯下的一个巨大错误是认为继承是为了增加重用。这是错误的。您可以通过组合增加重用。

当你最终不得不重新实现多态性来做你想做的事情时,是时候想想也许你想做的不是你应该做的。

关于C++:在基类中使用带有泛型虚函数的异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270783/

相关文章:

c++ - LCS 的二维数组表

c# - 如何将泛型方法限制为具有指定属性的类?

java - 什么是 PECS(生产者扩展消费者 super )?

swift - 如何在 Swift 中将继承应用于泛型

c++ - c++ 中基于范围的 for 循环的替代方法

c++ - 如何配置系统日志以便应用程序日志转到特定文件

Java - 将泛型类型映射到所述类型的使用者

inheritance - 使用 Spring Boot 时如何为 Spring HATEOAS 配置自定义 RelProvider?

javascript - 如何提醒 Shape、TwoDShape 类的名称?

c++ - 包括时区的 chrono 解析