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;});
我正在制作一个线程池,我有一些方法必须作为输入对象,这些对象子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;});