【发布时间】:2023-03-14 23:22:01
【问题描述】:
我想构建一个 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 中捕获可变参数 默认的 [=] 捕获似乎不理解可变参数列表
【问题讨论】:
-
您应该能够在 lambda 的捕获中扩展参数包 - 请参阅 Lambda Captures here
-
@mattnewport 所以当我在调用 func(args...) 时引用 lambda 体内的参数包时 - 它应该自动将其所有元素扩展为 lambda 的 [=] capture ,对吗?一切都应该开箱即用?
-
@mattnewport 我只是试着写 return [func,args...](){ func(args...); }; -- 但它仍然没有绑定到 wrapFunction 模板
标签: c++ c++11 lambda variadic-templates