C++如何将一个可变参数函数模板的参数包 - >包装成一个lambda

bar*_*ney 1 c++ lambda variadic-templates c++11

我想构建一个functon模板,它接受任何函数指针及其参数列表 - 并返回一个(有状态的)lambda,它将那些参数值绑定在里面(想想std :: bind但是基于lambda)

#include <iostream>
#include <vector>

template <class ...D>
class DEB;

template <class Ret, class ... Args>
auto getLambdaFromFunction(Ret(*func)(Args...)) {
    return [func](Args ... ar){ // auto could work here but lambda is anyway templated by external template's Args
        func(ar...);
    };
}

template <class Ret, class ... Args>
auto wrapFunction(Ret(*func)(Args...),Args... args) {
    return [=](){
        func(args...);
    };
}

int doone(int a, float b) {
    std::cout << "do one";
    return a;
}

int main() {
    auto lw = getLambdaFromFunction(doone); // compiles
    lw(1,2.); // invokation works

    auto lambda_parameters_binded = wrapFunction(doone, 1,2.); // **ERROR**: no matching function for call
lambda_parameters_binded(); // see mom, no hands ie no arguments!
}
Run Code Online (Sandbox Code Playgroud)

我相信我需要在wrapFunction中以某种方式在lambda中捕获可变参数,默认[=]捕获似乎不了解可变参数列表

use*_*670 5

你应该仔细阅读错误描述,现在函数接受float,但你传递double作为第三个参数.通过浮动将使其工作:

auto lambda_parameters_binded = wrapFunction(doone, 1, 2.0f);
Run Code Online (Sandbox Code Playgroud)

在在线编译器中运行

还要注意生成的lambda不返回任何内容,你应该在lambda体内添加另一个return语句:

return
(
    [=](void)
    {
        return(func(args...));
    }
);
Run Code Online (Sandbox Code Playgroud)