我想构建一个功能模板,它可以使用任何函数指针和放大器。它的参数列表 - 并返回一个(有状态的)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中捕获可变参数 默认的[=]捕获似乎不了解可变参数列表
答案 0 :(得分:5)
你应该仔细阅读错误描述,现在函数接受float,但你传递double作为第三个参数。通过浮动将使其工作:
auto lambda_parameters_binded = wrapFunction(doone, 1, 2.0f);
还要注意生成的lambda不返回任何内容,你应该在lambda体内添加另一个return语句:
return
(
[=](void)
{
return(func(args...));
}
);
答案 1 :(得分:1)
另一种解决方案可能是在不同的可变参数模板包中使用函数参数和传入的参数。这样就不会产生模糊函数。
template <class Ret, class ... Args, class ... Params>
auto wrapFunction(Ret(*func)(Args...),Params... params) {
return [=](){
func(params...);
};
}