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

标签 c++ function templates lambda

我有一个带有 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

我需要 模板来将变体 vector 参数表解包到函数调用中。这实际上在实现中起作用,唯一的问题是我不能直接将 lambda 传递给 addController。

最小的例子: https://onlinegdb.com/MS1cEreKhk

最佳答案

方法是通用可调用的:

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
}

关于c++ - 将 lambda 传递给以 std::function 作为参数的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73881018/

相关文章:

具有固定长度数组作为参数的 C++ 构造函数

c++ - qi::phrase_parse 返回真,即使调用了 qi::on_error

c - 在 C 中创建函数指针结构时从未完成的类型错误

c++ - 如何检查模板类型是否属于另一种模板类型?

c++ - is_invocable_r 忽略返回参数

c++ - 使用基类的重载函数

c++ - 如何找到一棵树的大小和高度?

matlab - 如何将函数应用于 MATLAB 中矩阵的每一行/列?

c - 函数从 C 中的字符串创建数组,无需 strtok

c++ - 还使用 'extern template class' 语法时模板类静态成员变量的特化