Listing 2: A function with default arguments

// Declaration
// ===========
typedef make_parameter_tuple_type<int, const X&, int>::ret
  FooParams;

// arg1 = 42
// arg2 = mandatory
// arg3 = 43

template<typename ParameterTuple>
void Foo(const ParameterTuple& args);

// Definition
// ==========
template<typename ParameterTuple>
void Foo(const ParameterTuple& client_args)
{
  typedef make_parameter_tuple_type<
    int, 
    mandatory_parameter_tag, 
    int>::ret FooDefaultParams;
  
  FooDefaultParams 
    default_args(42, mandatory_parameter_tag(), 43);
  
  FooParams args(client_args, default_args);

  FooInternal(
    args.get_parameter<0>(),
    args.get_parameter<1>(),
    args.get_parameter<2>()
    );
}