完美向lambda转发可变参数
不知怎的,我需要用c ++ variadic lambda实现懒惰评估。 我不太确定以下代码是否正常工作。
template <typename... ArgsT>
auto lazy_pack(ArgsT&& ... args) {
auto T = [&](bool condition) {
if(condition == false) return;
Foo v(std::forward<ArgsT>(args)...);
v.do_work();
};
return T;
}
问题是,如何捕获给定的参数列表并将它们完美地转发给另一个模板对象? 上面的例子编译,但我担心,如果任何悬而未决的参考可能发生。 另一种方法是通过复制和它们捕获参数并传递给对象:
template <typename... ArgsT>
auto lazy_pack(ArgsT&& ... args) {
auto T = [=](bool condition) {
if(condition == false) return;
Foo v(args...);
v.do_work();
};
return T;
}
我不知道我有什么你正在寻找,但也许下面的代码可以帮助你:
#include <tuple>
#include <functional>
#include <cstddef>
#include <utility>
#include <iostream>
struct Foo {
Foo(int v, const char *s): val{v}, str{s} { }
void do_work() { std::cout << val << " " << str << std::endl; }
int val;
const char *str;
};
template<std::size_t... I, typename... ArgsT>
auto lazy_pack(std::index_sequence<I...>, ArgsT&&... args) {
return [tup{std::forward_as_tuple(std::forward<ArgsT>(args)...)}](bool condition) {
if(condition == false) return;
Foo v(std::get<I>(tup)...);
v.do_work();
};
}
template<typename... ArgsT>
auto lazy_pack(ArgsT&& ... args) {
return lazy_pack(std::make_index_sequence<sizeof...(ArgsT)>(), std::forward<ArgsT>(args)...);
}
int main() {
auto l = lazy_pack(42, "bar");
l(false);
l(true);
}
您至少需要一个辅助函数才能够稍后解压转发给第一个参数的参数。
链接地址: http://www.djcxy.com/p/51579.html上一篇: Perfect forward variadic arguments to lambda
下一篇: Why doesn't C++11 implicitly convert lambdas to std::function objects?