C++ 将给定 class 的子 classes 作为参数

C++ have as parameters the subclasses of a given class

我正在制作一个线程池,我有一些方法必须作为输入对象,这些对象子class class Task.

我有这个class:

struct Task {
  virtual ~Task() = default;
  virtual void run();
};

并且线程池有一个这样的方法:

void submit(Task val);

我想通过 subclassing 任务 class 并将这些对象传递给线程池来创建线程池必须执行的作业,例如:

class Example : public Task {
    ....
    void run() override {
         cout << this->sayHi << endl;
         ....
    }
}

class Example2 : public Task {
    ....
    void run() override {
         cout << this->a + this-> b << endl;
    }

Example e (3);
Example2 e2 ("Hello");

tp.submit(e);
tp.submit(e2);

我的问题是,如果我尝试通过编写 void run() = 0 使 Task 成为纯虚拟 class,它就会抱怨,因为无法使用虚拟 class作为线程池的 submit 方法的参数。

是否有类似 Java 的功能,我可以在其中创建一个模板参数,指定该类型必须子class 给定类型? (例如 class C < T extends Task>)?

一个解决方案可能是实现 Task 的 运行 方法并使其抛出异常,但是如果 Task 被分心的人使用,这可能会在 运行 时引起问题,我更喜欢编译器检查的方式。

无法实例化纯虚函数 class,因为您没有纯虚函数的定义。

为了利用多态性,您的 submit 函数应该将指向 Task 的指针作为参数,而不是实例化 Task:

void submit(std::shared_ptr<Task> val);

我建议你先阅读更多关于多态性的内容。

您可能要考虑将 Task 用作函子,对于 lambda 来说最简单。

.submit( [&i](){ ++i;});