6

するとき:

std::vector<int> vec;
int number = 4;
boost::thread workerThread(&Method, number, vec)

given a method:
template<typename T>
void Method(int n, std::vector<T> & vec)
{
    //does stuff
}

手動で行う必要があるのはなぜですか:

boost::thread workerThread(&Method, number, boost::ref(vec))?

参照によって自動的に渡されないのはなぜですか?

編集::C++には組み込みのリフレクション/イントロスペクションの方法がないため、boost::threadがこれを調整するためにマクロメタプログラミングを行うことは理論的に可能です。

それで、ブースト/ C ++の主要な部分は一般的にメタ情報を渡しますか?

4

2 に答える 2

3

boost::threadオブジェクトが の署名を判別できないためですMethod

彼は渡される引数の型を知っているだけで、それらを提供された関数に転送します。boost::thread型が一致しない場合、関数を呼び出そうとした場所で複雑なエラー メッセージが表示されます。

引数の型を見ると、参照渡しと値渡しを区別することはできません。呼び出し側からは同じように見えるからです。または、より正式な観点から: テンプレート引数では、演繹T&は に減衰しTます。

boost::ref呼び出し側で明示的に提供することによってのみboost::thread、型を参照型として正しく識別することができます。

于 2013-06-28T15:40:33.857 に答える
0

おそらく、workerThread は Method のシグネチャの型を推測しようとしている可能性がありますが、これは &Method 自体からは推測できません。

于 2013-06-28T15:40:21.740 に答える