完美向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?