我在这里有一个enqueue
函数,其定义如下:
template<class F, class... Args>
auto ThreadPool::enqueue(F&& f, Args&&... args)
我需要传递的两个函数Matrix
类,第一个:
Matrix tester_gar(Matrix &m)
{
printf("It came here");
return m;
}
第二个:
void tester_garbage()
{
printf("It came here for no argument");
}
这里,Matrix是一个结构,它的定义对于这个问题不是必需的(如果需要可以发布)。我尝试了一些类似下面的方法以某种方式调用enqueue
函数,但它们都失败了。
Matrix a;
pool.enqueue(std::bind(&Matrix::tester_gar,&a),a);
OR
Matrix a;
pool.enqueue(std::bind(&Matrix::tester_garbage,&a));
通常,任何一项功能都必须用作a.tester_garbage()
或a.tester_gar(a)
。如何在这种情况下使用它们?
答案 0 :(得分:0)
您的问题陈述不太准确。但是,您当然应该正确地bind()
函数,或者最好完全省略bind()
:
pool.enqueue(&Matrix::tester_gar, &a, a);
pool.enqueue(&Matrix::tester_garbage, &a);
这些假设enqueue()
指出第一个参数是成员函数指针而不是可调用指针。如果它抱怨你可能需要通过std::mem_fn(&Matrix::test_gar)
。
答案 1 :(得分:0)
不清楚enqueue()
期望什么,但从它的外观来看,它需要一个可调用的,然后是可调用的参数。如果这是真的,那么你应该能够使用lambdas:
Matrix a;
Matrix m;
pool.enqueue([a](Matrix &m){ a.tester_gar(m); }, m);
pool.enqueue([a](){ a.tester_garbage(); });
或者,更具可读性:
Matrix a;
Matrix m;
auto func1 = [a](Matrix &m)
{
a.tester_gar(m);
};
auto func2 = [a]()
{
a.tester_garbage();
};
pool.enqueue(func1, m);
pool.enqueue(func2);
tester_gar()
和tester_garbage()
将在a
的副本上调用。如果您想在原始a
上调用它们,请使用a
代替[&a]
,通过引用捕获[a]
。如果您通过引用捕获,请注意a
的生命周期。