簡體   English   中英

如何將 lambda 作為模板類的成員函數的參數

[英]How to have lambda as member function's parameter of the template class

我有 C++ 類,它是模板。 它有成員函數,應該將任何 lamda 作為參數;

基本上這就是我想做的:-

#include <QFuture>
#include <QFutureWatcher>

template <class T>
class EFuture  {
private:
    QFuture<T> future;
    QFutureWatcher<T> watcher;

public:
    explicit EFuture(QFuture<T> &future);

    void onFinished(void (*f)() );
};


template <class T>
EFuture<T>::EFuture(QFuture<T> &future ): future(future)
{  }

template<class T>
void EFuture<T>::onFinished(void (*f)()){

    QObject::connect(watcher,&QFutureWatcher<T>::finished,f);
    watcher.setFuture(future);
}

這有嚴重的限制,因為我無法在我通過的 lambda 中捕獲任何內容。 我嘗試做這樣的事情: -

future->onFinished([someobject](){
   ...
});

我收到以下錯誤:-

connectionworker.cpp:106:24: error: no viable conversion from '(lambda at /home/noone/Development/Exatation/Exever/src/connectionworker.cpp:106:24)' to 'void (*)()'
efuture.h:17:28: note: passing argument to parameter 'f' here

只有非捕獲和非泛型 lambda 表達式才能轉換為函數指針。 任何 lambda 表達式——無論是無捕獲的還是捕獲的——都有自己的類型,只有編譯器知道。 在這種情況下,有兩種選擇:

  • 使用可以推斷 lambda 表達式類型的函數模板:

     template <typename F> void onFinished(F f);
  • 使用類型擦除技術,例如std::function<void()>

     #include <functional> void onFinished(std::function<void()> f);

暫無
暫無

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

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