[英]Accessing a class template parameter type inside a member function with a lambda fails
[英]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.