Natknąłem się na to podczas moich eksperymentów z C++ 11. Uważam, że jest to oczywiste rozwiązanie, ale nie udało mi się znaleźć żadnych innych przykładów tego na wolności, więc obawiam się, że czegoś brakuje.Alternatywa dla std :: funkcja przekazywania funkcji jako argument (wywołania zwrotne, itp.)
Praktyka mam na myśli (w funkcji "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;
}
Jest uważany za złą praktykę, czy jest to non-przenośne (Ja tylko próbowałem w MSVC++ 2015) ? Ponadto, w jaki sposób traktuje to kompilator; przez konwersję na std :: function?
Chciałbym nadal używać tego w moich projektach, ponieważ oczywiście określa wymagane typy argumentów i typ zwracania w "podpisie", akceptuje nullptr dla opcjonalności i wydaje się "po prostu działać" (jestem świadom tego, że to są słynne ostatnie słowa w C++).
@Amadeus: Może to zdania, które kończą się znakami zapytania. Na SO jest wiele pytań, które nie zostały sformułowane; to jest * nie * jeden z nich. –
Parametr jest zadeklarowany jako posiadający funkcję typu 'void (std :: future)', która jest dostosowana do wskaźnika do funkcji 'void (*) (std :: future )'. –