diff --git a/src/core/model/type-traits.h b/src/core/model/type-traits.h index b67892fd0..5de7f7886 100644 --- a/src/core/model/type-traits.h +++ b/src/core/model/type-traits.h @@ -20,302 +20,581 @@ #ifndef TYPE_TRAITS_H #define TYPE_TRAITS_H +#include "ptr.h" + /** - * \file - * \ingroup object - * TypeTraits introspection template. + * \file + * \ingroup object + * TypeTraits introspection template. */ -/** Type trait reference values */ +/** + * \ingroup object + * Inspect a type to deduce its features. + * \tparam T \deduced The type to inspect. + */ template struct TypeTraits { private: - struct NullType {}; //!< Null value type traits - template struct UnConst //!< Non-const type + /** Null value type traits. */ + struct NullType {}; + /** + * Not a const type. + * \tparam U \deduced The type being inspected. + */ + template struct UnConst { - typedef U Result; //!< Non-const result type + typedef U Result; /**< Non-const type. */ }; - template struct UnConst //!< Non-const template type traits + /** + * Const type. + * \tparam U \deduced The type being inspected. + */ + template struct UnConst { - typedef U Result; //!< Non-const result type + typedef U Result; /**< Non-const type. */ }; - template struct ReferenceTraits //!< Non-reference type traits + /** + * Not a reference type. + * \tparam U \deduced The type being inspected. + */ + template struct ReferenceTraits { - enum { IsReference = 0 /**< Non-reference value */ }; - typedef U ReferencedType; //!< Non-referenced result type + /** Value. */ enum { IsReference = 0 /**< Not a reference type. */ }; + typedef U ReferencedType; /**< Base type. */ }; - template struct ReferenceTraits//!< Reference type traits + /** + * Reference type. + * \tparam U \deduced The type being inspected. + */ + template struct ReferenceTraits { - enum { IsReference = 1 /**< Reference value */ }; - typedef U ReferencedType; //!< Referenced result type + /** Value. */ enum { IsReference = 1 /**< Reference type. */ }; + typedef U ReferencedType; /**< Base type. */ }; - template struct PointerTraits //!< Non-pointer type traits + /** + * Not a pointer type. + * \tparam U \deduced The type being inspected. + */ + template struct PointerTraits { - enum { IsPointer = 0}; //!< Non-pointer value - typedef U PointeeType; //!< Non-pointer result type + /** Value. */ enum { IsPointer = 0, /**< Not a pointer type. */ + IsPtr = 0 /**< Not a Ptr type. */}; + typedef U PointeeType; /**< Base type. */ }; - template struct PointerTraits //!< Pointer type traits + /** + * Pointer type. + * \tparam U \deduced The type being inspected. + */ + template struct PointerTraits { - enum { IsPointer = 1}; //!< Pointer value - typedef U PointeeType; //!< Pointer result type - }; - template struct FunctionPtrTraits //!< Non-function pointer type traits + /** Value. */ enum { IsPointer = 1, /**< Pointer type. */ + IsPtr = 0 /**< Not a Ptr type. */}; + typedef U PointeeType; /**< Pointee type. */ + }; + /** + * Ptr type. + * \tparam U \deduced The type being inspected. + */ + template struct PointerTraits > { - enum { IsFunctionPointer = 0}; //!< Non-function pointer value - typedef NullType ReturnType; //!< Non-function pointer result type + /** Value. */ enum { IsPointer = 0, /**< Not a pointer type. */ + IsPtr = 1 /**< Ptr type. */}; + typedef U PointeeType; /**< Pointee type. */ }; - template - struct FunctionPtrTraits //!< Function pointer type traits + /** + * Base type, after removing \c &, \c * and \c const. + * \tparam U \deduced The type being inspected. + */ + template struct Base { - enum { IsFunctionPointer = 1}; //!< Function pointer value - enum { nArgs = 0}; //!< Number of arguments - typedef U ReturnType; //!< Return type + typedef U Type; /**< Base type. */ }; - template - struct FunctionPtrTraits //!< Function pointer type traits - { - enum { IsFunctionPointer = 1}; //!< Function pointer value - enum { nArgs = 1}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef V1 Arg1Type; //!< First argument type - }; - template - struct FunctionPtrTraits //!< Function pointer type traits - { - enum { IsFunctionPointer = 1}; //!< Function pointer value - enum { nArgs = 2}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef V1 Arg1Type; //!< First argument type - typedef V2 Arg2Type; //!< Second argument type - }; - template - struct FunctionPtrTraits //!< Function pointer type traits - { - enum { IsFunctionPointer = 1}; //!< Function pointer value - enum { nArgs = 3}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef V1 Arg1Type; //!< First argument type - typedef V2 Arg2Type; //!< Second argument type - typedef V3 Arg3Type; //!< Third argument type - }; - template - struct FunctionPtrTraits //!< Function pointer type traits - { - enum { IsFunctionPointer = 1}; //!< Function pointer value - enum { nArgs = 4}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef V1 Arg1Type; //!< First argument type - typedef V2 Arg2Type; //!< Second argument type - typedef V3 Arg3Type; //!< Third argument type - typedef V4 Arg4Type; //!< Fourth argument type - }; - template - struct FunctionPtrTraits //!< Function pointer type traits - { - enum { IsFunctionPointer = 1}; //!< Function pointer value - enum { nArgs = 5}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef V1 Arg1Type; //!< First argument type - typedef V2 Arg2Type; //!< Second argument type - typedef V3 Arg3Type; //!< Third argument type - typedef V4 Arg4Type; //!< Fourth argument type - typedef V5 Arg5Type; //!< Fifth argument type - }; - template - struct FunctionPtrTraits //!< Function pointer type traits - { - enum { IsFunctionPointer = 1}; //!< Function pointer value - enum { nArgs = 6}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef V1 Arg1Type; //!< First argument type - typedef V2 Arg2Type; //!< Second argument type - typedef V3 Arg3Type; //!< Third argument type - typedef V4 Arg4Type; //!< Fourth argument type - typedef V5 Arg5Type; //!< Fifth argument type - typedef V6 Arg6Type; //!< Sixth argument type - }; - template struct PtrToMemberTraits //!< Pointer to member type traits + /** + * Base type, after removing \c &. + * \tparam U \deduced The type being inspected. + */ + template struct Base { - enum { IsPointerToMember = 0}; //!< Non-pointer to member value + typedef typename Base::Type Type; /**< Base type. */ }; - template - struct PtrToMemberTraits //!< Pointer to member type traits + /** + * Base type, after removing \c *. + * \tparam U \deduced The type being inspected. + */ + template struct Base { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 0}; //!< Number of arguments - typedef U ReturnType; //!< Return type + typedef typename Base::Type Type; /**< Base type. */ }; - template - struct PtrToMemberTraits //!< Pointer to const member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 0}; //!< Number of arguments - typedef U ReturnType; //!< Return type + /** + * Base type, after removing \c const. + * \tparam U \deduced The type being inspected. + */ + template struct Base + { + typedef typename Base::Type Type; /**< Base type. */ }; - template - struct PtrToMemberTraits //!< Pointer to member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 1}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type + /** + * Base type of a Ptr. + * \tparam U \deduced The type being inspected. + */ + template struct PtrBase + { + typedef U Type; /**< Base type. */ }; - template - struct PtrToMemberTraits //!< Pointer to const member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 1}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type + /** + * Base type of a Ptr. + * \tparam U \deduced The type being inspected. + */ + template struct PtrBase > + { + typedef U Type; /**< Base type. */ }; - template - struct PtrToMemberTraits //!< Pointer to member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 2}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type + /** + * Not a function pointer type. + * \tparam U \deduced The type being inspected. + */ + template struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 0 /**< Not a function pointer. */ }; + typedef NullType ReturnType; /**< Return type. */ }; - template - struct PtrToMemberTraits //!< Pointer to const member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 2}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type + /** + * Function pointer type. + * \tparam U \deduced Return type. + */ + template + struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 1 /**< Function pointer. */ }; + /** Value. */ enum { nArgs = 0 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ }; - template - struct PtrToMemberTraits //!< Pointer to member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 3}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type + /** + * Function pointer type. + * \tparam U \deduced Return type. + * \tparam V1 \deduced Argument type. + */ + template + struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 1 /**< Function pointer. */ }; + /** Value. */ enum { nArgs = 1 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef V1 Arg1Type; /**< First argument type. */ }; - template - struct PtrToMemberTraits //!< Pointer to const member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 3}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type + /** + * Function pointer type. + * \tparam U \deduced Return type. + * \tparam V1 \deduced Argument type. + * \tparam V2 \deduced Argument type. + */ + template + struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 1 /**< Function pointer. */ }; + /** Value. */ enum { nArgs = 2 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef V1 Arg1Type; /**< First argument type. */ + typedef V2 Arg2Type; /**< Second argument type. */ }; - template - struct PtrToMemberTraits //!< Pointer to member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 4}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type - typedef W4 Arg4Type; //!< Fourth argument type + /** + * Function pointer type. + * \tparam U \deduced Return type. + * \tparam V1 \deduced Argument type. + * \tparam V2 \deduced Argument type. + * \tparam V3 \deduced Argument type. + */ + template + struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 1 /**< Function pointer. */ }; + /** Value. */ enum { nArgs = 3 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef V1 Arg1Type; /**< First argument type. */ + typedef V2 Arg2Type; /**< Second argument type. */ + typedef V3 Arg3Type; /**< Third argument type. */ }; - template - struct PtrToMemberTraits //!< Pointer to const member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 4}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type - typedef W4 Arg4Type; //!< Fourth argument type + /** + * Function pointer type. + * \tparam U \deduced Return type. + * \tparam V1 \deduced Argument type. + * \tparam V2 \deduced Argument type. + * \tparam V3 \deduced Argument type. + * \tparam V4 \deduced Argument type. + */ + template + struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 1 /**< Function pointer. */ }; + /** Value. */ enum { nArgs = 4 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef V1 Arg1Type; /**< First argument type. */ + typedef V2 Arg2Type; /**< Second argument type. */ + typedef V3 Arg3Type; /**< Third argument type. */ + typedef V4 Arg4Type; /**< Fourth argument type. */ }; - template - struct PtrToMemberTraits //!< Pointer to member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 5}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type - typedef W4 Arg4Type; //!< Fourth argument type - typedef W5 Arg5Type; //!< Fifth argument type + /** + * Function pointer type. + * \tparam U \deduced Return type. + * \tparam V1 \deduced Argument type. + * \tparam V2 \deduced Argument type. + * \tparam V3 \deduced Argument type. + * \tparam V4 \deduced Argument type. + * \tparam V5 \deduced Argument type. + */ + template + struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 1 /**< Function pointer. */ }; + /** Value. */ enum { nArgs = 5 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef V1 Arg1Type; /**< First argument type. */ + typedef V2 Arg2Type; /**< Second argument type. */ + typedef V3 Arg3Type; /**< Third argument type. */ + typedef V4 Arg4Type; /**< Fourth argument type. */ + typedef V5 Arg5Type; /**< Fifth argument type. */ }; - template - struct PtrToMemberTraits //!< Pointer to const member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 5}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type - typedef W4 Arg4Type; //!< Fourth argument type - typedef W5 Arg5Type; //!< Fifth argument type + /** + * Function pointer type. + * \tparam U \deduced Return type. + * \tparam V1 \deduced Argument type. + * \tparam V2 \deduced Argument type. + * \tparam V3 \deduced Argument type. + * \tparam V4 \deduced Argument type. + * \tparam V5 \deduced Argument type. + * \tparam V6 \deduced Argument type. + */ + template + struct FunctionPtrTraits + { + /** Value. */ enum { IsFunctionPointer = 1 /**< Function pointer. */ }; + /** Value. */ enum { nArgs = 6 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef V1 Arg1Type; /**< First argument type. */ + typedef V2 Arg2Type; /**< Second argument type. */ + typedef V3 Arg3Type; /**< Third argument type. */ + typedef V4 Arg4Type; /**< Fourth argument type. */ + typedef V5 Arg5Type; /**< Fifth argument type. */ + typedef V6 Arg6Type; /**< Sixth argument type. */ }; - template - struct PtrToMemberTraits //!< Pointer to member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 6}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type - typedef W4 Arg4Type; //!< Fourth argument type - typedef W5 Arg5Type; //!< Fifth argument type - typedef W6 Arg6Type; //!< Sixth argument type + /** + * Not a pointer to member type. + * \tparam U \deduced Return type. + */ + template struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 0 /**< Not a pointer to member. */ }; }; - template - struct PtrToMemberTraits //!< Pointer to const member type traits - { - enum { IsPointerToMember = 1}; //!< Pointer to member value - enum { nArgs = 6}; //!< Number of arguments - typedef U ReturnType; //!< Return type - typedef W1 Arg1Type; //!< First argument type - typedef W2 Arg2Type; //!< Second argument type - typedef W3 Arg3Type; //!< Third argument type - typedef W4 Arg4Type; //!< Fourth argument type - typedef W5 Arg5Type; //!< Fifth argument type - typedef W6 Arg6Type; //!< Sixth argument type + /** + * Pointer to member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 0 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + }; + /** + * Pointer to const member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 0 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + }; + /** + * Pointer to member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 1 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + }; + /** + * Pointer to const member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 1 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + }; + /** + * Pointer to member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 2 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + }; + /** + * Pointer to const member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 2 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + }; + /** + * Pointer to member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 3 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + }; + /** + * Pointer to const member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 3 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + }; + /** + * Pointer to member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + * \tparam W4 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 4 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + typedef W4 Arg4Type; /**< Fourth argument type. */ + }; + /** + * Pointer to const member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + * \tparam W4 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 4 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + typedef W4 Arg4Type; /**< Fourth argument type. */ + }; + /** + * Pointer to member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + * \tparam W4 \deduced Argument type. + * \tparam W5 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 5 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + typedef W4 Arg4Type; /**< Fourth argument type. */ + typedef W5 Arg5Type; /**< Fifth argument type. */ + }; + /** + * Pointer to const member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + * \tparam W4 \deduced Argument type. + * \tparam W5 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 5 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + typedef W4 Arg4Type; /**< Fourth argument type. */ + typedef W5 Arg5Type; /**< Fifth argument type. */ + }; + /** + * Pointer to member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + * \tparam W4 \deduced Argument type. + * \tparam W5 \deduced Argument type. + * \tparam W6 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 6 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + typedef W4 Arg4Type; /**< Fourth argument type. */ + typedef W5 Arg5Type; /**< Fifth argument type. */ + typedef W6 Arg6Type; /**< Sixth argument type. */ + }; + /** + * Pointer to const member function. + * \tparam U \deduced Return type. + * \tparam V \deduced Class type. + * \tparam W1 \deduced Argument type. + * \tparam W2 \deduced Argument type. + * \tparam W3 \deduced Argument type. + * \tparam W4 \deduced Argument type. + * \tparam W5 \deduced Argument type. + * \tparam W6 \deduced Argument type. + */ + template + struct PtrToMemberTraits + { + /** Value. */ enum { IsPointerToMember = 1 /**< Pointer to member function. */ }; + /** Value. */ enum { nArgs = 6 /**< Number of arguments. */ }; + typedef U ReturnType; /**< Return type. */ + typedef W1 Arg1Type; /**< First argument type. */ + typedef W2 Arg2Type; /**< Second argument type. */ + typedef W3 Arg3Type; /**< Third argument type. */ + typedef W4 Arg4Type; /**< Fourth argument type. */ + typedef W5 Arg5Type; /**< Fifth argument type. */ + typedef W6 Arg6Type; /**< Sixth argument type. */ }; public: - typedef typename UnConst::Result NonConstType; //!< Non-const type - typedef typename ReferenceTraits::ReferencedType ReferencedType; //!< Referenced type - typedef typename PointerTraits::PointeeType PointeeType; //!< Pointee type - enum { IsPointerToMember = PtrToMemberTraits::IsPointerToMember}; //!< Pointer to member predicate - enum { IsPointer = PointerTraits::IsPointer}; //!< Pointer predicate - enum { IsReference = ReferenceTraits::IsReference}; //!< Reference predicate - enum { IsFunctionPointer = FunctionPtrTraits::IsFunctionPointer}; //!< Function pointer predicate - typedef PtrToMemberTraits PointerToMemberTraits; //!< Pointer to member traits type - typedef FunctionPtrTraits FunctionPointerTraits; //!< Function pointer traits + /** Not a const type. */ + typedef typename UnConst::Result NonConstType; + /** Referenced type. */ + typedef typename ReferenceTraits::ReferencedType ReferencedType; + /** Pointee type. */ + typedef typename PointerTraits::PointeeType PointeeType; + /** Base type, after removing \c &, \c * and \c const. */ + typedef typename Base::Type BaseType; + /** Ptr base type. */ + typedef typename PtrBase::Type PtrBaseType; + /** Predicates. */ + enum { + /** Pointer to member predicate. */ + IsPointerToMember = PtrToMemberTraits::IsPointerToMember, + /** Pointer predicate. */ + IsPointer = PointerTraits::IsPointer, + /** Ptr predicate. */ + IsPtr = PointerTraits::IsPtr, + /** Reference predicate. */ + IsReference = ReferenceTraits::IsReference, + /** Function pointer predicate. */ + IsFunctionPointer = FunctionPtrTraits::IsFunctionPointer + }; + /** Pointer to member traits type. */ + typedef PtrToMemberTraits PointerToMemberTraits; + /** Function pointer traits. */ + typedef FunctionPtrTraits FunctionPointerTraits; };