    #include <iostream>
	#include <tuple>
	using namespace std;
	
    // bar : does something with an arbitrary tuple
    // (no variadic template arguments)
	template <class Tuple>
	void bar(Tuple t)
	{
        // .... do something with the tuple ...
		std::cout << std::tuple_size<Tuple>::value;
	}
	
    // foo : takes a function pointer and an arbitrary number of other
    // arguments
	template <class Func, typename... Ts>
	void foo(Func f, Ts... args_in)
	{
        // construct a tuple containing the variadic arguments
		std::tuple<Ts...> t = std::make_tuple(args_in...);

        // pass this tuple to the function f
		f(t);
	}
	
	int main()
	{
        // this is not highly refined; you must provide the types of the
        // arguments (any suggestions?)
		foo(bar<std::tuple<int, const char *, double>>, 123, "foobar", 43.262);
		return 0;
	}