簡體   English   中英

C ++:使用mem_fn和bind1st創建一個函數對象

[英]C++: Creating a function object with mem_fn and bind1st

免責聲明 :此描述包含許多Qt特定功能。 回答這個問題不是必須的,我只是將其包括在內以解釋背景。

我需要在我的QT應用程序中進行一些繁重的計算。 為了做到這一點,我想使用QtConcurrent::run(myFunction)這是Qt的async版本,並創建一個future,在某些時候它將包含myFunction的結果。

問題在於該函數既是成員函數,又需要復雜的參數。

我知道您可以將函數和指針都傳遞給QtConcurrent :: run。 然后將在指針上調用該函數。 您甚至可以提供參數列表。 但是似乎此列表僅接受諸如intdoubleQString

實際問題:

我想轉換以下代碼行:

model->nextStep(simulatedResult->last().molecules, dt)

進入

myFunction()

這意味着我需要

  1. 將指針綁定到函數
  2. 將參數綁定到函數

到目前為止,這是我的代碼:

auto memfun=std::mem_fn(&ConcreteModel::nextStep);
auto memfun_bound_to_model=std::bind1st(memfun,model);
auto memfun_bound_result=std::bind1st(memfun_bound_to_model,simulatedResult->last().molecules);
auto memfun_bound_dt=std::bind1st(memfun_bound_result,dt);

不幸的是,這不起作用。 有18個編譯器錯誤,這是pastebin: http : //pastebin.com/2rBQgFNL

如果您能解釋如何正確執行此操作,那就太好了。 一個答案不是必需的,但更好的是QtConcurrent :: run的代碼。

只需使用lambda表達式。

auto myFunction = [&] { return model->nextStep(simulatedResult->last().molecules, dt); }

您也可以使用std::bind (請參閱@JonathanWakely的答案),但是lamda表達式更加通用和強大。

另外,請記住,從多個線程讀取和寫入同一內​​存將導致數據爭用(除非使用同步,否則請勿將指向可變數據的指針/引用傳遞給QT線程)。

您正在嘗試將C ++ 98 bind1st與C ++ 11 mem_fn混合使用。

bind1st需要一個適應性強的二元函數 ,這意味着一個定義了某些類型定義,和一個取恰好兩個參數。 您不能將它與需要兩個以上的東西一起使用,並且一次綁定一個參數。

在C ++ 11中,由於使用了decltype和其他新功能,可以包裝沒有那些typedef的函數對象,因此“可適應的二進制函數”現在是一個無用的概念,而bind1st則是無用和不推薦使用的。

解決方案是簡單地使用C ++ 11功能而不是bind1st ,例如std::bind或lambda表達式。

auto myFunction = std::bind( &ConcreteModel::nextStep, model, simulatedResult->last().molecules, dt);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM