将 lambda 传递给以 std::function 作为参数的模板函数

gal*_*tte 3 c++ lambda templates function

我有一个带有std::function参数的模板函数,模板参数定义函数签名:

template<typename... Args>
void addController(const char * name, const std::function<bool(Args...)> & func);
Run Code Online (Sandbox Code Playgroud)

它可以传递一个std::function变量:

std::function<bool()> foo_func = [this]()->bool {return this->isFoo(); };
addController<>("foo", foo_func);  //Works
Run Code Online (Sandbox Code Playgroud)

但如果我直接传递 lambda,则无法推导出类型:

//Fails to compile
addController<>("foo", [this]()->bool {return this->isFoo(); });
Run Code Online (Sandbox Code Playgroud)

使用非模板函数可以:

void addControllerNoArg(const char * name, std::function<bool()> func);
addControllerNoArg("foo", [this]() {return this->isFoo(); });  //Works
Run Code Online (Sandbox Code Playgroud)

我需要 <typename... Args> 模板来将变体向量参数表展开到函数调用中。这实际上在实现中确实有效,唯一的问题是我无法直接将 lambda 传递给 addController 。

最小示例: https: //onlinegdb.com/MS1cEreKhk

Jar*_*d42 7

方法是通用可调用:

template<typename F>
void addController(const char* name, F f)
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)