2016-05-06 7 views
3

Ich könnte tuple_element einfach dreimal benutzen, wenn ich wüsste, dass das Tupel nur 3 Elemente hat, aber das weiß ich nicht.Tupel zu Funktionsparametern konvertieren

+0

Gibt es einen Grund, warum tun Sie möchten '(bool, int, bool)' 'anstelle von' (typename T :: tuple_type &) '? – Felics

+0

Ich verwende ein Tupel, um Argumente für einen Rückruf zu speichern. Sie können ein [] (bool a, int b, bool c) lambda (und die Parameter haben Namen, die gut sind) übergeben, statt ein [] (Tupel), das aufgrund der Verwendung von get <> oder has komplexer ist um sie in lokalen Variablen zu speichern, um ihnen sinnvolle Namen zu geben. – James

Antwort

2

einen generischen Typ Merkmal schreiben:

template <class C, class F> 
struct mem_ptr; 

template <class C, class F> 
using mem_ptr_t = typename mem_ptr<C, F>::type; 

Und spezialisieren es für tuple:

template <class C, class... Args> 
struct mem_ptr<C, std::tuple<Args...>> { 
    using type = void (C::*)(Args...); 
}; 

Und dann verwenden:

void fun(mem_ptr_t<C, typename T::tuple_type> f); 

Dies setzt voraus, Sie wollen void als Rück Art.


Könnte dies verallgemeinern aus dem Tupel func Teil Aufspaltung des mem_ptr Teil:

template <class C, class F> 
struct mem_ptr { 
    using type = F C::*; 
}; 

template <class C, class F> 
using mem_ptr_t = typename mem_ptr<C, F>::type; 

template <class R, class T> 
struct tuple_to_func; 

template <class R, class... Args> 
struct tuple_to_func<R, std::tuple<Args...>> { 
    using type = R(Args...); 
}; 

template <class R, class T> 
using tuple_to_func_t = typename tuple_to_func<R, T>::type; 

In diesem Fall würden Sie wollen:

void fun(mem_ptr_t<C, 
    tuple_to_func_t<void, typename T::tuple_type> 
> f);