[/ 
  Copyright 2007 John Maddock.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

[section:function_traits function_traits]
[def __argN '''arg<replaceable>N</replaceable>_type''']

   template <class F>
   struct function_traits
   {
      static const std::size_t    arity = __below;
      typedef __below           result_type;
      typedef __below           __argN; 
   };

The class template function_traits will only compile if:

* The compiler supports partial specialization of class templates.
* The template argument `F` is a /function type/, note that this ['[*is not]] 
the same thing as a /pointer to a function/.

[tip
function_traits is intended to introspect only C++ functions of the 
form R (), R( A1 ), R ( A1, ... etc. ) and not function pointers or 
class member functions. To convert a function pointer type to a suitable 
type use __remove_pointer.]

[table Function Traits Members 
[[Member] [Description]] 
[[`function_traits<F>::arity`] 
   [An integral constant expression that gives the number of arguments accepted by the function type `F`.]]
[[`function_traits<F>::result_type`] 
   [The type returned by function type `F`.]]
[[`function_traits<F>::__argN`] 
   [The '''<replaceable>N</replaceable>th''' argument type of function type `F`, where `1 <= N <= arity` of `F`.]]
]

[table Examples
[[Expression] [Result]] 
[[`function_traits<void (void)>::arity`] [An integral constant expression that has the value 0.]]
[[`function_traits<long (int)>::arity`] [An integral constant expression that has the value 1.]]
[[`function_traits<long (int, long, double, void*)>::arity`] [An integral constant expression that has the value 4.]]
[[`function_traits<void (void)>::result_type`] [The type `void`.]]
[[`function_traits<long (int)>::result_type`] [The type `long`.]]
[[`function_traits<long (int)>::arg1_type`] [The type `int`.]]
[[`function_traits<long (int, long, double, void*)>::arg4_type`] [The type `void*`.]]
[[`function_traits<long (int, long, double, void*)>::arg5_type`] [A compiler error: there is no `arg5_type` since there are only four arguments.]]
[[`function_traits<long (*)(void)>::arity`] [A compiler error: argument type is a /function pointer/, and not a /function type/.]]

]
   
[endsect]

