Here is a simple structure for unpacking a tuple and providing its elements as arguments for this function:
namespace detail { template<int... Is> struct seq { }; template<int N, int... Is> struct gen_seq : gen_seq<N - 1, N - 1, Is...> { }; template<int... Is> struct gen_seq<0, Is...> : seq<Is...> { }; template<typename F, typename... Ts, int... Is> void call_with_tuple(F&& f, std::tuple<Ts...> const& t, seq<Is...>) { (std::forward<F>(f))(std::get<Is>(t)...); } } template<typename F, typename... Ts> void call_with_tuple(F&& f, std::tuple<Ts...> const& t) { detail::call_with_tuple(std::forward<F>(f), t, detail::gen_seq<sizeof...(Ts)>()); }
Inside your Consume() function, you can simply do:
call_with_tuple(handler, mArgs);
With another context:
#include <iostream> #include <functional> template< typename ... Args > class Message { public: Message( Args&& ... args ) { mArgs = std::make_tuple( args ... ); } std::tuple< Args ... > mArgs; typedef std::function< void ( Args ... ) > HandlerType; void Consume( HandlerType handler ) { call_with_tuple(handler, mArgs); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ } };
And here is a living example .
source share