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
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
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);
Gibt es einen Grund, warum tun Sie möchten '(bool, int, bool)' 'anstelle von' (typename T :: tuple_type &) '? – Felics
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