2016-06-25 5 views
0

어떻게 든 C++ 가변 람다 (lambda)로 지연 평가를 구현해야합니다. 다음 코드가 올바르게 작동하는지 확실하지 않습니다.람다에 대한 완벽한 forward variadic 인수

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

'lazy_pack'이 반환되고 원래의 인수가 잠재적으로 삭제 된 후에도 람다가 실제로 호출 될 수 있음을 확인하고 인수 값을 사용하는 방법을 알지 못합니다. –

답변

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

첫 번째 매개 변수로 전달 된 매개 변수를 나중에 언팩 할 수 있도록하려면 적어도 하나 이상의 도우미 함수가 필요합니다.

관련 문제