繁体   English   中英

C ++如何将可变参数函数模板的参数包->包装到lambda中

[英]C++ how to wrap a variadic function template's parameter pack -> into a lambda

我想构建一个使用任何函数指针及其参数列表的functon模板 -并返回一个(有状态的)lambda,该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!
}

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

您应该仔细阅读错误描述,现在函数接受float,但是您将double作为第三个参数传递。 传递float将使其起作用:

auto lambda_parameters_binded = wrapFunction(doone, 1, 2.0f);

在在线编译器中运行

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

return
(
    [=](void)
    {
        return(func(args...));
    }
);

另一个解决方案是在不同的可变参数模板包中具有函数参数和传入的参数。 这样,将不会产生模版函数的歧义。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM