这是我的代码的一个小例子,如何在构造函数中正确初始化成员pool_。
#include <vector>
#include <thread>
#include <iostream>
namespace b {
class A;
typedef void (A::*Func) (void);
struct c {
Func fun;
int num;
std::vector<std::thread> threads;
};
class A {
public:
A() {
pool_ = {{&A::func1, 1, }, {&A::func2, 2, }}; // how to initialize?
}
private:
std::vector<c> pool_;
void func1(void) { std::cout << "func1\n"; };
void func2(void) { std::cout << "func2\n"; };
void CreateThread(c& pool) {
for (int i = 0; i < pool.num; ++i) {
pool.threads.push_back(std::thread(pool.fun, this));
}
}
};
} // namespace b
int main() {
b::A a;
return 0;
}
平台:Ubuntu 14.04 with g ++ 4.8.4
编译命令:
g++ -Wall -std=c++11 test.cc -lpthread -o test
主要错误信息是:
error: use of deleted function ‘std::thread::thread(std::thread&)’
我知道这是因为不允许复制构造和std :: thread的赋值。但我尝试了其他方法并失败了。
答案 0 :(得分:2)
优雅地解决这个问题的两个步骤:
struct c {
c(Func fun, int num, std::vector<std::thread> threads = {})
: fun(fun)
, num(num)
, threads(std::move(threads))
{}
Func fun;
int num;
std::vector<std::thread> threads;
};
然后将您的对象整齐地放入pool_
A()
{
pool_.emplace_back(&A::func1, 1);
pool_.emplace_back(&A::func2, 2);
}