Я наткнулся на это во время моих экспериментов с С++ 11. Я нахожу, что это очевидное решение, но я не смог найти других примеров этого в дикой природе, поэтому я обеспокоен тем, что там чего-то не хватает.
Практика, о которой я говорю (в функции "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;
}
Является ли это плохой практикой или не переносится (я только пробовал это в MSVС++ 2015)? Кроме того, как компилятор относится к этому; путем преобразования в std:: function?
Я хотел бы продолжать использовать это в своих проектах, поскольку он, очевидно, указывает необходимые типы аргументов и тип возвращаемого значения в "подписи", принимает nullptr для опциональности и, кажется, "просто работает" (я знаю, что эти являются известными последними словами в С++).