2016-06-25 6 views
0

Irgendwie muss ich faule Bewertung mit C++ variadic Lambda implementieren. Ich bin mir nicht ganz sicher, ob der folgende Code richtig funktioniert.Perfect Forward variadic Argumente zu Lambda

Die Frage ist, wie kann ich eine gegebene Argumentliste erfassen und sie perfekt an ein anderes Vorlagenobjekt weiterleiten? Das obige Beispiel kompiliert, aber ich mache mir Sorgen darüber, ob eine unpassende Referenz passieren könnte. Eine andere Möglichkeit ist Argumente durch Kopie zu erfassen und sie und übergeben Sie an das Objekt:

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

Ich sehe nicht, wie Sie vermeiden können, Kopien zu machen, da das Lambda tatsächlich aufgerufen wird, und die Argumentwerte viel später, lange nachdem 'lazy_pack' zurückkehrt und seine ursprünglichen Argumente potentiell zerstört werden. –

Antwort

0

Ich bin nicht sicher, Ich habe, was Sie suchen, aber vielleicht der folgende Code kann Ihnen helfen:

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

Sie benötigen mindestens eine weitere Hilfsfunktion, um später die an die erste weitergegebenen Parameter entpacken zu können.

Verwandte Themen