2017-11-07 3 views
-1

私は次のように定義してここにenqueue機能を有している:私は、Matrixクラス内に存在する第一の両方を通過する必要が'&&'署名が含まれている場合、C++でFucntionと引数を渡す方法は?

template<class F, class... Args> 
auto ThreadPool::enqueue(F&& f, Args&&... args) 

2機能:

Matrix tester_gar(Matrix &m) 
{ 
    printf("It came here"); 
    return m; 
} 

秒:

void tester_garbage() 
{ 
    printf("It came here for no argument"); 
} 

ここでは、Matrixは構造体です。この問題ではその定義は必要ありません(必要に応じて投稿できます).I havいくつかの方法で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)として使用する必要があります。このシナリオではどのように使用しますか?

+1

通常、xをrvalue-reference(&&)に変換するにはstd :: move(x)を呼び出す必要があります。 – Valentin

+0

@Valentin:rvalue参照は含まれていません。 'enqueue()'へのパラメータは、推測されます、すなわち、それらは_forwarding references_です。 –

+0

@DietmarKühlあなたはもちろん正しいです。私はこの構文が嫌いです:) – Valentin

答えて

0

あなたの問題文はあまり正確ではありません。しかし、あなたは確かに、おそらく、好ましくは、いずれかの適切bind()機能や、はず、bind()完全に省略します。

pool.enqueue(&Matrix::tester_gar, &a, a); 
pool.enqueue(&Matrix::tester_garbage, &a); 

これらは前提としている最初のパラメータではなく呼び出し可能なよりもメンバ関数ポインタであることをenqueue()フィギュアアウト。それが文句を言うなら、std::mem_fn(&Matrix::test_gar)を渡す必要があるかもしれません。

0

enqueue()が何を期待しているのかはっきりしていませんが、見た目からは1つの呼び出し可能なものと、呼び出し可能な引数が必要です。

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の寿命に注意してください。

関連する問題