[/ 
  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:is_function is_function]
   
   template <class T>
   struct is_function : public __tof {};
  
__inherit If T is a (possibly cv-qualified) function type then inherits from __true_type, 
otherwise inherits from __false_type.  Note that this template does not detect /pointers
to functions/, or /references to functions/, these are detected by __is_pointer and 
__is_reference respectively:

   typedef int f1();      // f1 is of function type.
   typedef int (*f2)();   // f2 is a pointer to a function.
   typedef int (&f3)();   // f3 is a reference to a function.

__std_ref 3.9.2p1 and 8.3.5.

[all_compilers]

__header ` #include <boost/type_traits/is_function.hpp>` or ` #include <boost/type_traits.hpp>`

__examples

[:`is_function<int (void)>` inherits from `__true_type`.]

[:`is_function<long (double, int)>::type` is the type `__true_type`.]

[:`is_function<long (double, int)>::value` is an integral constant 
expression that evaluates to /true/.]

[:`is_function<long (*)(double, int)>::value` is an integral constant 
expression that evaluates to /false/: the argument in this case is a pointer type,
not a function type.]

[:`is_function<long (&)(double, int)>::value` is an integral constant 
expression that evaluates to /false/: the argument in this case is a 
reference to a function, not a function type.]

[:`is_function<long (MyClass::*)(double, int)>::value` is an integral constant 
expression that evaluates to /false/: the argument in this case is a pointer
to a member function.]

[:`is_function<T>::value_type` is the type `bool`.]

[tip Don't confuse function-types with pointers to functions:

`typedef int f(double);`

defines a function type,

`f foo;`

declares a prototype for a function of type `f`,

`f* pf = foo;`

`f& fr = foo;`

declares a pointer and a reference to the function `foo`.

If you want to detect whether some type is a pointer-to-function then use:

`__is_function<__remove_pointer<T>::type>::value && __is_pointer<T>::value`

or for pointers to member functions you can just use 
__is_member_function_pointer directly.
]

[endsect]


