我正在尝试创建一个模板函数,该函数将一个函数作为参数,并且参数函数具有供模板推导的参数。
示例时间:
这是一个接受固定函数类型并起作用的函数
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_b
像 func_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/