私はC++ 11の実験でこれを見つけました。私はそれが明白な解決策であることがわかりましたが、私は野生のそれの他の例を見つけることができなかったので、私は何かが欠けていることを心配しています。std :: functionの代わりに関数を引数として渡す(コールバックなど)
私は(「addAsync」機能で)を参照しています実際:
#include <thread>
#include <future>
#include <iostream>
#include <chrono>
int addTwoNumbers(int a, int b) {
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
return a + b;
}
void printNum(std::future<int> future) {
std::cout << future.get() << std::endl;
}
void addAsync(int a, int b, auto callback(std::future<int>) -> void) { //<- the notation in question
auto res = std::async(std::launch::async, addTwoNumbers, a, b);
if (callback) //super straightforward nullptr handling
return callback(std::move(res));
}
int main(int argc, char** argv) {
addAsync(10, 10, [](std::future<int> number) { //lambda functions work great
addAsync(number.get(), 20, [](std::future<int> number) {
addAsync(893, 4387, printNum); //as do standard functions
addAsync(2342, 342, nullptr); //executes, sans callback
std::cout << number.get() << std::endl;
});
});
std::cout << "main thread: " << std::this_thread::get_id() << std::endl;
return 0;
}
は(私はMSVC++ 2015でそれをのみ試してみた)、それは悪い習慣を検討し、またはそれは非移植可能です?また、コンパイラはこれをどのように扱いますか? std :: functionへの変換によって?
"署名"に必要な引数の型と戻り値を明示し、オプションとしてnullptrを受け入れ、 "うまくいく"ように見えるので、私は自分のプロジェクトでこれを使い続けたいと思っていますこれらはC++の有名な最後の言葉です)。 stdする::機能」を
1つの選択肢は、(メンバ関数ポインタを含む)関数ポインタになります。しかし、std::function
はちょうどそんなによりよい(IMO)で、引数としての機能を通過させるための
@Amadeus:多分、それは疑問符で終わる文章でしょうか。 SOには多くのil-formed質問があります。これは*一つではありません。 –
このパラメータは、 'void(std :: future)'関数へのポインタに調整された関数型 'void(std :: future )'を持つと宣言されています。 –