這是一個簡單的代碼片段:
#include <thread>
#include <future>
#include <functional>
void foo(int){}
int main()
{
std::thread(foo, 1).join(); //works indeed
std::packaged_task<void(int)> task{foo, 1}; //complian
std::packaged_task<void(int)> task{std::bind(foo, 1)};
}
兩者都 std::thread()接受std::packaged_task() 可呼叫目標,為什么代碼std::packaged_task()有點不同?為什么不制作std::packged_task()類似的作品std::thread()(即接受類似的論點std::thread)?
類模板 std::packaged_task 包裝任何 Callable 目標(函式、lambda 運算式、系結運算式或另一個函式物件),以便可以異步呼叫它。它的回傳值或拋出的例外存盤在可以通過 std::future 物件訪問的共享狀態中。
uj5u.com熱心網友回復:
std::packaged_task不立即運行函式/可呼叫函式,函式執行被延遲,引數可以稍后傳遞給void operator()( ArgTypes... args );,因此可能的建構式template< class Function, class... Args > explicit packaged_task( Function&& f, Args&&... args );不是必需的。
但是std::thread立即運行函式/可呼叫,因此必須將引數傳遞給建構式template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );。您可以將其視為糖,以避免持續撰寫類似std::thread(bind(f, 1));而不是方便的代碼std::thread(f, 1);。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460420.html
上一篇:任何人都可以提供與static_assert一起使用的符合MISRAC 的“offsetof”宏/模板/函式嗎?
