我有一個帶std::function引數的模板函式,模板引數定義函式簽名:
template<typename... Args>
void addController(const char * name, const std::function<bool(Args...)> & func);
它可以傳遞一個std::function變數:
std::function<bool()> foo_func = [this]()->bool {return this->isFoo(); };
addController<>("foo", foo_func); //Works
但是,如果我直接傳遞 lambda,則無法推斷型別:
//Fails to compile
addController<>("foo", [this]()->bool {return this->isFoo(); });
并且使用非模板函式有效:
void addControllerNoArg(const char * name, std::function<bool()> func);
addControllerNoArg("foo", [this]() {return this->isFoo(); }); //Works
我需要 <typename...Args> 模板來將變體向量引數表展開到函式呼叫中。這實際上在實作中起作用,唯一的問題是我不能直接將 lambda 傳遞給 addController。
最小示例: https ://onlinegdb.com/MS1cEreKhk
uj5u.com熱心網友回復:
要走的路是通用可呼叫的:
template<typename F>
void addController(const char* name, F f)
如果需要,您可以將其轉發到您的std::function版本:
template <typename... Args>
void addController(const char* name, const std::function<bool(Args...)> & func)
{
/*..*/
}
template <typename F>
void addController(const char* name, F f)
{
addController(name, std::function{f}); // CTAD used, so C 17 required
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515151.html
標籤:C 功能模板拉姆达
