Mic*_*ell 9 c++ lambda templates c++11
我正在尝试创建一个模板函数,该函数将函数作为参数,参数函数具有模板推导的参数.
示例时间:
这是一个接受固定函数类型并且有效的函数
void func_a(void(*func)(int)) {
    func(1);
}
int main() {
    auto f = [](int x) -> void { printf("%i\n", x); };
    func_a(f);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我想要做的,扩展第一个例子(这不会编译)
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;
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想func_b同时接受常规函数和lambda函数func_a,但使用模板魔法.
不幸的是,模板推导不适用于隐式转换.但是,您可以将lambda显式转换为函数指针类型.最简单但有点令人困惑的方法是应用一元+运算符:
func_b(+f);
Run Code Online (Sandbox Code Playgroud)
或者您可以使用更直观,但也详细和干扰DRY的强制转换操作:
func_b(static_cast<void(*)(int)>(f));
Run Code Online (Sandbox Code Playgroud)
但也许,您可能只想接受任何可调用类型,而不仅仅是函数指针:
template <class Fun>
void func_c(Fun&& func) {
    func(1);
}
Run Code Online (Sandbox Code Playgroud)
这与lambda很好用.不涉及转换.
func_c(f);
Run Code Online (Sandbox Code Playgroud)
它还可用于捕获lambdas(无法转换为函数指针),std::function以及函数对象(如中定义的那些)<functional>.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1234 次  |  
        
|   最近记录:  |