[/ 
  (C) Copyright Edward Diener 2011,2012
  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:tti_detail Macro Metafunctions]

The TTI library uses macros to create metafunctions, in the current scope, 
for introspecting an inner element by name. Each macro for a particular type of inner 
element has two forms, the simple one where the first macro parameter designating the 
'name' of the inner element is used to create the name of the metafunction, and the 
complex one where the first macro parameter, called 'trait', designates 
the name of the metafunction and the second macro parameter designates the 'name' to be 
introspected. Other than that difference, the two forms of the macro create metafunctions
which have the exact same functionality.

To use these metafunctions you can include the main general header file 'boost/tti/tti.hpp',
unless otherwise noted. Alternatively you can include a specific header file as 
given in the table below.

A table of these macros is given, based on the inner element whose 
existence the metaprogrammer is introspecting. More detailed explanations  
and examples for each of the macro metafunctions will follow this 
section in the documentation. The actual syntax for each macro metafunction
can be found in the reference section, and examples of usage for all the 
macro metafunctions can be found in the 
[link sectti_usingMM "Using the Macro Metafunctions"] section.

In the Template column below only the name generated by the simple form 
of the template is given since the name generated by the complex form is always 'trait'
where 'trait' is the first parameter to the corresponding complex form macro. 

All of the introspecting metafunctions in the table below return a boolean constant 
called 'value', which specifies whether or not the inner element exists. All of the 
metafunctions also have a nested type called 'type', which for each one is the type 
of the boolean constant value. This is always boost::mpl::bool_.

[table:tbmacros TTI Macro Metafunctions
  [
    [Inner Element]
    [Macro]
    [Template]
    [Specific Header File]
  ]
  [
    [Type]
    [
    [macroref BOOST_TTI_HAS_TYPE](name)
    ]
    [
    `has_type_'name'`
    
    class BOOST_TTI_T = enclosing type
    
    class BOOST_TTI_U = (optional) MPL lambda expression invoked with the inner type and returning a boolean constant
    ]
    [[headerref boost/tti/has_type.hpp `has_type.hpp`]]
  ]
  [
    [Class/Struct]
    [
    [macroref BOOST_TTI_HAS_CLASS](name)
    ]
    [
    `has_class_'name'`
    
    class BOOST_TTI_T = enclosing type
    
    class BOOST_TTI_U = (optional) MPL lambda expression invoked with the inner class/struct and returning a boolean constant
    ]
    [[headerref boost/tti/has_class.hpp `has_class.hpp`]]
  ]
  [
    [Enumeration]
    [
    [macroref BOOST_TTI_HAS_ENUM](name)
    ]
    [
    `has_enum_'name'`
    
    class BOOST_TTI_T = enclosing type
    
    class BOOST_TTI_U = (optional) MPL lambda expression invoked with the inner enum and returning a boolean constant
    ]
    [[headerref boost/tti/has_enum.hpp `has_enum.hpp`]]
  ]
  [
    [Union]
    [
    [macroref BOOST_TTI_HAS_UNION](name)
    ]
    [
    `has_union_'name'`
    
    class BOOST_TTI_T = enclosing type
    
    class BOOST_TTI_U = (optional) MPL lambda expression invoked with the inner union and returning a boolean constant
    ]
    [[headerref boost/tti/has_union.hpp `has_union.hpp`]]
  ]
  [
    [Class Template]
    [
    Using variadic macros:
    
    [macroref BOOST_TTI_HAS_TEMPLATE](name)
    
    Not using variadic macros:
    
    [macroref BOOST_TTI_HAS_TEMPLATE](name,BOOST_PP_NIL)
    ]
    [
    `has_template_'name'`
    
    class BOOST_TTI_T = enclosing type
    
    All of the template parameters must be template type parameters ( 'class' or 'typename' parameters )
    ]
    [[headerref boost/tti/has_template.hpp `has_template.hpp`]]
  ]
  [
    [Class Template with params]
    [
    Using variadic macros:
    
    [macroref BOOST_TTI_HAS_TEMPLATE](name,...[footnote The template parameters as variadic data.])
    
    Not using variadic macros:
    
    [macroref BOOST_TTI_HAS_TEMPLATE](name,ppArray[footnote The template parameters as the tuple part of a Boost PP array.])
    ]
    [
    `has_template_'name'`
    
    class BOOST_TTI_T = enclosing type
    ]
    [[headerref boost/tti/has_template.hpp `has_template.hpp`]]
  ]
  [
    [Member data]
    [
    [macroref BOOST_TTI_HAS_MEMBER_DATA](name)
    ]
    [
    `has_member_data_'name'`
    
    class BOOST_TTI_T = enclosing type 
                      OR 
                  pointer to member data ( 'MemberData_Type Enclosing_Type::*' )
    
    class BOOST_TTI_R = (optional) data type.
                  If the first parameter is the pointer to member data this must not be specified.
    ]
    [[headerref boost/tti/has_member_data.hpp `has_member_data.hpp`]]
  ]
  [
    [Member function]
    [
    [macroref BOOST_TTI_HAS_MEMBER_FUNCTION](name)
    ]
    [
    `has_member_function_'name'`
    
    class BOOST_TTI_T   = enclosing type 
                        OR 
                    pointer to member function 
                    ( 'Return_Type (Enclosing_Type::*) ( Zero or more comma-separated parameter types )' )
    
    class BOOST_TTI_R   = (optional) return type if the first parameter is the enclosing type.
                    If the first parameter is the pointer to member function this must not be specified.
    
    class BOOST_TTI_FS  = (optional) function parameter types as a Boost MPL forward sequence.
                    If the first parameter is the pointer to member function this must not be specified.
                    If there are no function parameters this does not have to be specified.
                    Defaults to boost::mpl::vector<>.
    
    class BOOST_TTI_TAG = (optional) Boost `function_types` tag type.
                    If the first parameter is the pointer to member function this must not be specified.
                    Defaults to `boost::function_types::null_tag`.
    ]
    [[headerref boost/tti/has_member_function.hpp `has_member_function.hpp`]]
  ]
  [
    [Member function template]
    [
    Using variadic macros:
    
    [macroref BOOST_TTI_HAS_MEMBER_FUNCTION_TEMPLATE](name,...[footnote The instantiated template parameters as variadic data.])
    
    Not using variadic macros:
    
    [macroref BOOST_TTI_HAS_MEMBER_FUNCTION_TEMPLATE](name,ppArray[footnote The instantiated template parameters as the tuple part of a Boost PP array.])
    ]
    [
    `has_member_function_template_'name'`
    
    class BOOST_TTI_T   = enclosing type 
                        OR 
                    pointer to member function 
                    ( 'Instantiated return_type (Enclosing_Type::*) ( Zero or more comma-separated instantiated parameter types )' )
    
    class BOOST_TTI_R   = (optional) instantiated return type if the first parameter is the enclosing type.
                    If the first parameter is the pointer to member function this must not be specified.
    
    class BOOST_TTI_FS  = (optional) instantiated function parameter types as a Boost MPL forward sequence.
                    If the first parameter is the pointer to member function this must not be specified.
                    If there are no function parameters this does not have to be specified.
                    Defaults to boost::mpl::vector<>.
    
    class BOOST_TTI_TAG = (optional) Boost `function_types` tag type.
                    If the first parameter is the pointer to member function this must not be specified.
                    Defaults to `boost::function_types::null_tag`.
    ]
    [[headerref boost/tti/has_member_function_template.hpp `has_member_function_template.hpp`]]
  ]
  [
    [Static member data]
    [
    [macroref BOOST_TTI_HAS_STATIC_MEMBER_DATA](name)
    ]
    [
    `has_static_member_data_'name'`
    
    class BOOST_TTI_T = enclosing type
    
    class BOOST_TTI_TYPE = data type
    ]
    [[headerref boost/tti/has_static_member_data.hpp `has_static_member_data.hpp`]]
  ]
  [
    [Static member function]
    [
    [macroref BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION](name)
    ]
    [
    `has_static_member_function_'name'`
    
    class BOOST_TTI_T   = enclosing type
    
    class BOOST_TTI_R   = return type 
                        OR 
                    function type ( 'Return_Type (Zero or more comma-separated parameter types)' )
    
    class BOOST_TTI_FS  = (optional) function parameter types as a Boost MPL forward sequence.
                    If the second parameter is the function type this must not be specified.
                    If there are no function parameters, this does not have to be specified.
                    Defaults to boost::mpl::vector<>.
    
    class BOOST_TTI_TAG = (optional) Boost `function_types` tag type.
                    If the second parameter is the function type this must not be specified.
                    Defaults to `boost::function_types::null_tag`.
    ]
    [[headerref boost/tti/has_static_member_function.hpp `has_static_member_function.hpp`]]
  ]
  [
    [Static member function template]
    [
    Using variadic macros:
    
    [macroref BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_TEMPLATE](name,...[footnote The instantiated template parameters as variadic data.])
    
    Not using variadic macros:
    
    [macroref BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_TEMPLATE](name,ppArray[footnote The instantiated template parameters as the tuple part of a Boost PP array.])
    ]
    [
    `has_static_member_function_template_'name'`
    
    class BOOST_TTI_T   = enclosing type
    
    class BOOST_TTI_R   = instantiated return type
                        OR 
                    function type ( 'Instantiated return_Type (Zero or more comma-separated instantiated parameter types)' )
    
    class BOOST_TTI_FS  = (optional) instantiated function parameter types as a Boost MPL forward sequence.
                    If the second parameter is the function type this must not be specified.
                    If there are no function parameters, this does not have to be specified.
                    Defaults to boost::mpl::vector<>.
    
    class BOOST_TTI_TAG = (optional) Boost `function_types` tag type.
                    If the second parameter is the function type this must not be specified.
                    Defaults to `boost::function_types::null_tag`.
    ]
    [[headerref boost/tti/has_static_member_function_template.hpp `has_static_member_function_template.hpp`]]
  ]
  [
    [Data, either member data or static member data]
    [
    [macroref BOOST_TTI_HAS_DATA](name)
    ]
    [
    `has_data_'name'`
    
    class BOOST_TTI_T = enclosing type
    
    class BOOST_TTI_TYPE = data type
    ]
    [[headerref boost/tti/has_data.hpp `has_data.hpp`]]
  ]
  [
    [Function, either member function or static member function]
    [
    [macroref BOOST_TTI_HAS_FUNCTION](name)
    ]
    [
    `has_function_'name'`
    
    class BOOST_TTI_T   = enclosing type
    
    class BOOST_TTI_R   = return type 
    
    class BOOST_TTI_FS  = (optional) function parameter types as a Boost MPL forward sequence.
                    If there are no function parameters, this does not have to be specified.
                    Defaults to boost::mpl::vector<>.
    
    class BOOST_TTI_TAG = (optional) Boost `function_types` tag type.
                    Defaults to `boost::function_types::null_tag`.
    ]
    [[headerref boost/tti/has_function.hpp `has_function.hpp`]]
  ]
  [
    [Function template, either member function template or static member function template]
    [
    Using variadic macros:
    
    [macroref BOOST_TTI_HAS_FUNCTION_TEMPLATE](name,...[footnote The instantiated template parameters as variadic data.])
    
    Not using variadic macros:
    
    [macroref BOOST_TTI_HAS_FUNCTION_TEMPLATE](name,ppArray[footnote The instantiated template parameters as the tuple part of a Boost PP array.])
    ]
    [
    `has_function_template_'name'`
    
    class BOOST_TTI_T   = enclosing type
    
    class BOOST_TTI_R   = instantiated return type
    
    class BOOST_TTI_FS  = (optional) instantiated function parameter types as a Boost MPL forward sequence.
                    If there are no function parameters, this does not have to be specified.
                    Defaults to boost::mpl::vector<>.
    
    class BOOST_TTI_TAG = (optional) Boost `function_types` tag type.
                    Defaults to `boost::function_types::null_tag`.
    ]
    [[headerref boost/tti/has_function_template.hpp `has_function_template.hpp`]]
  ]
]

[endsect]
