lambda的完美前向可变参数

时间:2016-06-25 03:26:41

标签: c++11 lambda variadic-templates

不知何故,我需要用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;
}

1 个答案:

答案 0 :(得分:0)

我不确定我得到了你想要的东西,但也许以下代码可以帮助你:

#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);
}

您需要至少一个辅助函数才能在以后解压缩转发给第一个参数的参数。