如何在线程对象中调用多态方法?
How to call a polymorphic method in a thread object?
struct Base {
virtual void do_work() = 0;
};
struct Derived_A : Base {
void do_work() override {
// work A
}
};
struct Derived_B : Base {
void do_work() override {
// work B
}
};
int main() {
std::vector<std::unique_ptr<Base>> workers;
workers.emplace_back(std::unique_ptr<Base>(new Derived_A()));
workers.emplace_back(std::unique_ptr<Base>(new Derived_B()));
std::vector<std::thread> threads;
for (const auto& worker : workers) {
// Compile error
// expecting Derived_A and Derived_B do_work functions to be called respectively
threads.emplace_back(&Base::do_work, worker);
}
}
在线程中调用do_work()
方法的正确方法是什么?
多态性应该正常工作,因为指向虚成员函数的指针在被调用时总是表现出多态性。只需要做两处更改即可使您的程序正确无误:
- 创建线程时必须写
worker.get()
。这是因为指向成员函数 Base::do_work
的指针是“可调用的”,其参数是指向 Base
的指针,但您不能直接将智能指针“传递”给它。
- 您必须记住在
main
结束之前分离或加入线程。
struct Base {
virtual void do_work() = 0;
};
struct Derived_A : Base {
void do_work() override {
// work A
}
};
struct Derived_B : Base {
void do_work() override {
// work B
}
};
int main() {
std::vector<std::unique_ptr<Base>> workers;
workers.emplace_back(std::unique_ptr<Base>(new Derived_A()));
workers.emplace_back(std::unique_ptr<Base>(new Derived_B()));
std::vector<std::thread> threads;
for (const auto& worker : workers) {
// Compile error
// expecting Derived_A and Derived_B do_work functions to be called respectively
threads.emplace_back(&Base::do_work, worker);
}
}
在线程中调用do_work()
方法的正确方法是什么?
多态性应该正常工作,因为指向虚成员函数的指针在被调用时总是表现出多态性。只需要做两处更改即可使您的程序正确无误:
- 创建线程时必须写
worker.get()
。这是因为指向成员函数Base::do_work
的指针是“可调用的”,其参数是指向Base
的指针,但您不能直接将智能指针“传递”给它。 - 您必须记住在
main
结束之前分离或加入线程。