this,this、潜在的にはthisに関する質問です。ファンクションシグネチャに応じた値/参照としてのバリアブルテンプレートの転送タイプ
私はAddFunction
メソッドは渡された引数で渡された関数を呼び出すstd::thread
を生成します、その後、その関数への関数と引数のリストを受信する以下のクラス、持っている:これは、その結果
class Processes {
public:
Processes() {}
~Processes() {
for (auto &t : threads_) {
t.join();
}
}
template <class Function, typename... Args>
void AddFunction(Function &&func, Args &&... args) {
threads_.emplace_back(std::forward<Function>(func),
std::forward<Args>(args)...);
}
private:
std::vector<std::thread> threads_;
}
をオブジェクトがコピー可能でない場合は、は、std::ref
に参照がラップされている必要があるため、このオブジェクトがスレッドの有効期間を超えてコピーされます。
ターゲット関数の署名に指定されている場合は、参照によってオブジェクトを渡したいと思っています。
私は、ラムダを使用してみました:
template <class Function, typename... Args>
void AddFunction(Function &&func, Args &&... args) {
threads_.emplace_back([&]() { func(std::forward<Args>(args)...); });
}
しかし、ラムダが基準行動によってキャプチャが得られ、値で渡す前に参照によって値をキャプチャして、これは、不正な動作になります。 目的関数の署名に従って、引数を値または参照のいずれかとして転送する関数を実装するにはどうすればよいですか??
例:
void Foo(int a, std::vector<int> const &b) { /* ... */ }
int main() {
Processes procs;
int a = 6;
std::vector<int> b;
procs.AddFunction(
Foo,
a, // Should be passed by value
b // Should be passed by reference (as implemented by std::ref)
);
return 0;
}
は、これが問題を解決しました。私はあなたがこのようにして関数呼び出しを解くことができるのか分からなかった。 '{}'の構文は何ですか?それは空のコンストラクタですか?ありがとうございました! – jlicht
はい、 'type {}'は 'type'の空のコンストラクタです。' {} '構文は' type() 'とは逆の場合もあります。 – Jarod42