2016-05-16 6 views
0

Ich brauche Hilfe beim Implementieren eines Entwurfs für mein Programm. Also ich habe ein Tupel mit allem, was ich in es will, aus diesem Aufruf erstelltÜbergeben Sie ein Tupel an eine Hilfsklasse

auto t1 = getMyTuple(); 

Aber ich will eine Hilfsklasse machen, so dass ich die < < Betreiber überlasten kann, so dass, wenn ich rufe

std::cout << my_tuple_helper; 

es wird jedes Ding ausdrucken.

ich eine Hilfsklasse, aber ich weiß nicht, wie t1 in sie zu erhalten .. sieht es so etwas wie

template<typename... Args> 
class my_tuple_helper 
{ 
    public: 
    std::tuple<Args...> my_tup; 

    my_tuple_helper(std::tuple<Args... t) 
    { 
    my_tup = t; 
    } 

//or 

    my_tuple_helper(Args... args) 
    { 
    my_tup = std::tuple<Args...>(args...); 
    } 

}; 

das Problem mit einem dieses Konstrukteuren bin ich weiß nicht, wie die Vorlage zu übergeben, wenn die Erstellung das Objekt, wenn es Art auto wie ist:

auto t1 = getMyTuple(); 
my_tuple_helper<???> mth(t1); 

ich hatte etwas, das zusammengestellt, wie diese

template<typename T> 
class my_tuple_helper 
{ 
    public: 
    T my_tup; 

    my_tuple_helper(T t) 
    { 
    my_tup = t; 
    } 
}; 
sah

und ich nennen könnte

auto t1 = getMyTuple(); 
my_tuple_helper<decltype(t1)> mth(t1); 

Aber ich mag die Tatsache nicht, dass T könnte alles sein, eher Id eine std :: tuple my_tup als ein T my_tup hat (ich bin nicht einmal sicher, ob das funktionieren würde) .

Hat jemand irgendwelche Ideen, wie ich ein Std :: Tupel, das in einem Auto-Objekt gespeichert ist, in meine Hilfsklasse bekommen kann, damit ich als std :: tuple-Objekt (in der Klasse) darauf zugreifen kann.

Vielen Dank im Voraus

Antwort

1

Sie können für diese

template<typename... Args> 
my_tuple_helper<Args...> 
make_my_tuple_helper(const std::tuple<Args...>& tup) 
{ 
    return my_tuple_helper<Args...>(tup); 
} 

eine Funktion tun, und es

auto t1 = getMyTuple(); 
auto mth = make_my_tuple_helper(t1); 
+0

Danke, ich habe nie darüber nachgedacht! – user2770808

1

Den üblichen Weg, dies zu tun, ist eine Factory-Methode zu machen, die folgern die Vorlage Argumente für Sie. So würden Sie my_tuple_helper wie folgt aussehen:

template<typename... Args> 
class my_tuple_helper 
{ 
    public: 
    std::tuple<Args...> my_tup; 

    my_tuple_helper(std::tuple<Args...> t) 
     : my_tup {std::move(t)} 
    { } 
}; 

Dann eine Factory-Methode wie folgt schreiben:

template <typename... Args> 
my_tuple_helper<Args...> 
make_tuple_helper (const std::tuple<Args...>& t) 
{ 
    return { t }; 
} 

Live Demo

Dann, wenn Sie die Ausgabe Ihrer Tupel möchten, können Sie es tun könnte in ein Anruf, so:

auto t1 = getMyTuple(); 
std::cout << make_tuple_helper(t1); 
+0

Vielen Dank, Ihre Demo war sehr hilfreich und behob mein Problem :) – user2770808