c++ - 将 lambda 传递给接受模板类型函数的函数

标签 c++ templates c++11 lambda

我正在尝试创建一个模板函数,该函数将一个函数作为参数,并且参数函数具有供模板推导的参数。

示例时间:

这是一个接受固定函数类型并起作用的函数

void func_a(void(*func)(int)) {
    func(1);
}
int main() {
    auto f = [](int x) -> void { printf("%i\n", x); };
    func_a(f);
    return 0;
}

这是我想做的,扩展第一个例子(这不会编译)

template <typename... T>
void func_b(void(*func)(T...)) {
    func(1);
}
int main() {
    auto f = [](int x) -> void { printf("%i\n", x); };
    func_b(f);       // neither of
    func_b<int>(f); // these work
    return 0;
}

理想情况下,我希望 func_bfunc_a 一样接受常规函数和 lambda 函数,但使用模板魔法。

最佳答案

不幸的是,模板推导不适用于隐式转换。但是,您可以将 lambda 显式转换为函数指针类型。最短但有点令人困惑的方法是应用一元 + 运算符:

func_b(+f);

或者您可以使用更直观但也冗长且违反 DRY 的转换操作:

func_b(static_cast<void(*)(int)>(f));

但也许,您只想接受任何可调用类型,而不仅仅是函数指针:

template <class Fun>
void func_c(Fun&& func) {
    func(1);
}

这适用于 lambda。不涉及转化。

func_c(f);

它也适用于捕获 lambda(无法转换为函数指针),std::function和函数对象,例如 <functional> 中定义的对象.

关于c++ - 将 lambda 传递给接受模板类型函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486927/

相关文章:

c++ - 通过等待条件等待多个正在运行的线程

c++ - C++中的高速缓冲

c++ - 为 cout 做一个包装器?

c++ - 自定义 QComboBox

c++ - 为什么/etc/目录下没有创建文件

c++ - 在调用 toupper()、tolower() 等之前,我是否需要转换为 unsigned char?

templates - 返回不同输入范围时函数返回类型不匹配的现象

javascript - 使用 Javascript 更改 'views' 的最佳方法是什么?

c++ - 根据用户输入创建特定类型的对象

c++ - 自动生成函数头,可变参数模板