如何在'&&'中用C ++传递Fucntion和Arguments涉及签名?

时间:2017-11-07 03:24:29

标签: c++ c++11

我在这里有一个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)。如何在这种情况下使用它们?

2 个答案:

答案 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的生命周期。