// bslmf_memberfunctionpointertraits.h                                -*-C++-*-
#ifndef INCLUDED_BSLMF_MEMBERFUNCTIONPOINTERTRAITS
#define INCLUDED_BSLMF_MEMBERFUNCTIONPOINTERTRAITS

#include <bsls_ident.h>
BSLS_IDENT("$Id: $")

//@PURPOSE: Provide meta-functions to detect member function pointer traits.
//
//@CLASSES:
//  bslmf::MemberFunctionPointerTraits: meta-function for detecting member
//  function pointer traits
//  bslmf::IsMemberFunctionPointer: meta-function to determine if a type is
//  a member function pointer
//
//@SEE_ALSO: bslmf_functionpointertraits
//
//@DESCRIPTION: This component provides meta-functions for determining the
// traits of a member function pointer.  Two meta-functions are provided:
// 'bslmf::IsMemberFunctionPointer', and 'bslmf::MemberFunctionPointerTraits'.
// 'bslmf::IsMemberFunctionPointer' tests if a given type is a supported member
// function pointer.  'bslmf::MemberFunctionPointerTraits' determines the
// traits of a member function type, including the type of the object that it
// is a member of, its result type, and the type of its list of arguments.
//
// Note that, in order to support pre-C++11 compilers in a manageable way, only
// member functions with up to 14 arguments and no C-style (varargs) elipses
// are supported on all platforms by this component.  When variadic templates
// are available, any number of arguments are supported.  C-style elipses are
// not supported by this component at all.  To identify all member function
// pointers see {'bslmf_ismemberfunctionpointer'}.
//
///Usage
///-----
// Define the following function types:
//..
//  typedef void (*VoidFunc0)();
//..
// and the following 'struct' with the following members:
//..
//  struct MyTestClass {
//      static void voidFunc0() {}
//      int func1(int) { return 0; }
//      int func2(int, int) { return 1; }
//  };
//..
// In order to deduce the types of 'voidFunc0' and 'func1', we will use the C++
// template system to get two auxiliary functions:
//..
//  template <class t_TYPE>
//  void checkNotMemberFunctionPointer(t_TYPE object)
//  {
//      assert(0 == bslmf::IsMemberFunctionPointer<t_TYPE>::value);
//  }
//
//  template <class t_BSLMF_RETURN, class t_ARGS, class t_TYPE>
//  void checkMemberFunctionPointer(t_TYPE object)
//  {
//      assert(1 == bslmf::IsMemberFunctionPointer<t_TYPE>::value);
//      typedef typename bslmf::MemberFunctionPointerTraits<t_TYPE>::ResultType
//          ResultType;
//      typedef typename
//                     bslmf::MemberFunctionPointerTraits<t_TYPE>::ArgumentList
//          ArgumentList;
//      assert(1 == (bsl::is_same<ResultType, t_BSLMF_RETURN>::value));
//      assert(1 == (bsl::is_same<ArgumentList, t_ARGS>::value));
//  }
//..
// The following program should compile and run without errors:
//..
//  void usageExample()
//  {
//      assert(0 == bslmf::IsMemberFunctionPointer<int>::value);
//      assert(0 == bslmf::IsMemberFunctionPointer<int>::value);
//
//      checkNotMemberFunctionPointer(&MyTestClass::voidFunc0);
//      checkMemberFunctionPointer<int, bslmf::TypeList1<int> >(
//                                                        &MyTestClass::func1);
//      checkMemberFunctionPointer<int, bslmf::TypeList2<int, int> >(
//                                                        &MyTestClass::func2);
//  }
//..

#include <bslscm_version.h>

#include <bslmf_if.h>
#include <bslmf_integralconstant.h>
#include <bslmf_removecv.h>
#include <bslmf_tag.h>
#include <bslmf_typelist.h>

#include <bsls_compilerfeatures.h>

namespace BloombergLP {
namespace bslmf {

template <class t_PROTOTYPE, class t_TEST_PROTOTYPE>
struct MemberFunctionPointerTraits_Imp;
    // Forward declaration.

                     // =================================
                     // class MemberFunctionPointerTraits
                     // =================================

template <class t_PROTOTYPE>
struct MemberFunctionPointerTraits
: public MemberFunctionPointerTraits_Imp<
      typename bsl::remove_cv<t_PROTOTYPE>::type,
      typename bsl::remove_cv<t_PROTOTYPE>::type> {
    // This metafunction determines the traits of a member function type,
    // including the type of the object that it is a member of, its result
    // type, and the type of its list of arguments.
};

                       // =============================
                       // class IsMemberFunctionPointer
                       // =============================

template <class t_PROTOTYPE>
struct IsMemberFunctionPointer
: bsl::integral_constant<
      bool,
      MemberFunctionPointerTraits<t_PROTOTYPE>::IS_MEMBER_FUNCTION_PTR> {
    // This template determines if the specified 't_PROTOTYPE' is a member
    // function pointer.  'value' is defined as 1 if the specified
    // 't_PROTOTYPE' is a member function, and a zero value otherwise.
};

// ---- Anything below this line is implementation specific.  Do not use. ----

                         // ==========================
                         // Unsupported Configurations
                         // ==========================

#if defined(BSLS_COMPILERFEATURES_SUPPORT_REF_QUALIFIERS) &&                  \
    !defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
    // All of our compilers that support reference qualifiers also support
    // variadic templates.  It would be wasteful to do a variadic expansion
    // that would never be used.  Thus, we exclude this code from processing by
    // 'sim_cpp11_features.pl' and verify that if reference qualifiers are
    // supported then variadics are supported, too.
#   error Feature not supported for compilers without variadic templates
#endif

#if defined(BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES) &&                  \
    !defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
    // All of our compilers which identify 'noexcept' as part of the type
    // system (a C++17 piece of functionality) similarly also support variadic
    // templates, so we refrain from having the dead code to support this case.
#   error Feature not supported for compilers without variadic templates
#endif

                // -------------------------------------------
                // class MemberFunctionPointerTraits_ClassType
                // -------------------------------------------

#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES  // $var-args=14
template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
class MemberFunctionPointerTraits_ClassType {
    // This 'class' determines whether the specified 't_PROTOTYPE' is a
    // 'const', 'volatile' or 'noexcept' member function of the specified
    // 't_TYPE'.  The 'Type' member will be a correctly const and/or volatile
    // qualified version of 't_TYPE'.  This metafunction is necessary because
    // some old compilers do not correctly dispatch to the correct partial
    // specialization of 'MemberFunctionPointerTraits_Imp' based on
    // cv-qualification of the member-function pointer.

    typedef Tag<0> NonCVTag;            // non-'const', non-'volatile'
    typedef Tag<1> ConstTag;            // 'const'
    typedef Tag<2> VolTag;              // 'volatile'
    typedef Tag<3> ConstVolTag;         // 'const volatile'
#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES && \
    defined(BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES)
    typedef Tag<4> NonCVNoExceptTag;    // non-'const', non-'volatile',
                                        // 'noexcept'
    typedef Tag<5> ConstNoExceptTag;    // 'const', 'noexcept'
    typedef Tag<6> VolNoExceptTag;      // 'volatile', 'noexcept'
    typedef Tag<7> ConstVolNoExceptTag; // 'const', 'volatile', 'noexcept'
#endif  // BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile);
    static ConstVolTag test(
                         t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const volatile);
#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES &&                         \
    defined(BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES)
    static NonCVNoExceptTag test(
                               t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) noexcept);
    static ConstNoExceptTag test(
                         t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const noexcept);
    static VolNoExceptTag test(
                      t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile noexcept);
    static ConstVolNoExceptTag test(t_BSLMF_RETURN(t_TYPE::*)(t_ARGS...)
                                                      const volatile noexcept);
#endif  // BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

  public:
    // TYPES
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;
        // Depending on 'IS_CONST', add or do not add a const qualifier to
        // 't_TYPE'.

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
        // Depending on 'IS_VOLATILE', add or do not add a volatile qualifier
        // to 't_TYPE'.
};
#elif BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// The following section is automatically generated.  **DO NOT EDIT**
// Generator command line:
//   sim_cpp11_features.pl bslmf_memberfunctionpointertraits.h
#ifndef BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT
#define BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT 14
#endif
#ifndef BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A
#define BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A                    \
    BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT
#endif
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE
#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0
          ,
          class t_ARGS_0 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1
          ,
          class t_ARGS_1 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2
          ,
          class t_ARGS_2 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3
          ,
          class t_ARGS_3 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4
          ,
          class t_ARGS_4 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5
          ,
          class t_ARGS_5 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6
          ,
          class t_ARGS_6 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7
          ,
          class t_ARGS_7 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8
          ,
          class t_ARGS_8 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9
          ,
          class t_ARGS_9 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10
          ,
          class t_ARGS_10 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11
          ,
          class t_ARGS_11 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12
          ,
          class t_ARGS_12 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13
          ,
          class t_ARGS_13 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13
          ,
          class = BSLS_COMPILERFEATURES_NILT>
class MemberFunctionPointerTraits_ClassType;

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0
template <class t_PROTOTYPE, class t_BSLMF_RETURN, class t_TYPE>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)());
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)() const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)() volatile);
    static ConstVolTag test(t_BSLMF_RETURN(t_TYPE::*)() const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01) volatile);
    static ConstVolTag test(
                         t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01) const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02));
    static ConstTag test(
                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02) const);
    static VolTag test(
                    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02) volatile);
    static ConstVolTag test(
              t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02) const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(
                  t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03));
    static ConstTag test(
            t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03) const);
    static VolTag test(
         t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03) volatile);
    static ConstVolTag
    test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03)
             const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(
       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04));
    static ConstTag
    test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04)
             const);
    static VolTag test(t_BSLMF_RETURN (
              t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04) volatile);
    static ConstVolTag
    test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04)
             const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (
            t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04, t_ARGS_05));
    static ConstTag test(t_BSLMF_RETURN (
              t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04, t_ARGS_05)
                             const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (
              t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04, t_ARGS_05)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07,
                                            t_ARGS_08> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07,
                                                  t_ARGS_08) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07,
                                                       t_ARGS_08)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07,
                                            t_ARGS_08,
                                            t_ARGS_09> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07,
                                                  t_ARGS_08,
                                                  t_ARGS_09) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07,
                                                       t_ARGS_08,
                                                       t_ARGS_09)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07,
                                            t_ARGS_08,
                                            t_ARGS_09,
                                            t_ARGS_10> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07,
                                                  t_ARGS_08,
                                                  t_ARGS_09,
                                                  t_ARGS_10) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07,
                                                       t_ARGS_08,
                                                       t_ARGS_09,
                                                       t_ARGS_10)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07,
                                            t_ARGS_08,
                                            t_ARGS_09,
                                            t_ARGS_10,
                                            t_ARGS_11> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07,
                                                  t_ARGS_08,
                                                  t_ARGS_09,
                                                  t_ARGS_10,
                                                  t_ARGS_11) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07,
                                                       t_ARGS_08,
                                                       t_ARGS_09,
                                                       t_ARGS_10,
                                                       t_ARGS_11)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07,
                                            t_ARGS_08,
                                            t_ARGS_09,
                                            t_ARGS_10,
                                            t_ARGS_11,
                                            t_ARGS_12> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11,
                                                    t_ARGS_12));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11,
                                                    t_ARGS_12) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07,
                                                  t_ARGS_08,
                                                  t_ARGS_09,
                                                  t_ARGS_10,
                                                  t_ARGS_11,
                                                  t_ARGS_12) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07,
                                                       t_ARGS_08,
                                                       t_ARGS_09,
                                                       t_ARGS_10,
                                                       t_ARGS_11,
                                                       t_ARGS_12)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07,
                                            t_ARGS_08,
                                            t_ARGS_09,
                                            t_ARGS_10,
                                            t_ARGS_11,
                                            t_ARGS_12,
                                            t_ARGS_13> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11,
                                                    t_ARGS_12,
                                                    t_ARGS_13));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11,
                                                    t_ARGS_12,
                                                    t_ARGS_13) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07,
                                                  t_ARGS_08,
                                                  t_ARGS_09,
                                                  t_ARGS_10,
                                                  t_ARGS_11,
                                                  t_ARGS_12,
                                                  t_ARGS_13) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07,
                                                       t_ARGS_08,
                                                       t_ARGS_09,
                                                       t_ARGS_10,
                                                       t_ARGS_11,
                                                       t_ARGS_12,
                                                       t_ARGS_13)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 14
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13,
          class t_ARGS_14>
class MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                            t_BSLMF_RETURN,
                                            t_TYPE,
                                            t_ARGS_01,
                                            t_ARGS_02,
                                            t_ARGS_03,
                                            t_ARGS_04,
                                            t_ARGS_05,
                                            t_ARGS_06,
                                            t_ARGS_07,
                                            t_ARGS_08,
                                            t_ARGS_09,
                                            t_ARGS_10,
                                            t_ARGS_11,
                                            t_ARGS_12,
                                            t_ARGS_13,
                                            t_ARGS_14> {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11,
                                                    t_ARGS_12,
                                                    t_ARGS_13,
                                                    t_ARGS_14));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                    t_ARGS_02,
                                                    t_ARGS_03,
                                                    t_ARGS_04,
                                                    t_ARGS_05,
                                                    t_ARGS_06,
                                                    t_ARGS_07,
                                                    t_ARGS_08,
                                                    t_ARGS_09,
                                                    t_ARGS_10,
                                                    t_ARGS_11,
                                                    t_ARGS_12,
                                                    t_ARGS_13,
                                                    t_ARGS_14) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                  t_ARGS_02,
                                                  t_ARGS_03,
                                                  t_ARGS_04,
                                                  t_ARGS_05,
                                                  t_ARGS_06,
                                                  t_ARGS_07,
                                                  t_ARGS_08,
                                                  t_ARGS_09,
                                                  t_ARGS_10,
                                                  t_ARGS_11,
                                                  t_ARGS_12,
                                                  t_ARGS_13,
                                                  t_ARGS_14) volatile);
    static ConstVolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                       t_ARGS_02,
                                                       t_ARGS_03,
                                                       t_ARGS_04,
                                                       t_ARGS_05,
                                                       t_ARGS_06,
                                                       t_ARGS_07,
                                                       t_ARGS_08,
                                                       t_ARGS_09,
                                                       t_ARGS_10,
                                                       t_ARGS_11,
                                                       t_ARGS_12,
                                                       t_ARGS_13,
                                                       t_ARGS_14)
                                const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 14

#else   // BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.
template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
class MemberFunctionPointerTraits_ClassType {
    typedef Tag<0> NonCVTag;
    typedef Tag<1> ConstTag;
    typedef Tag<2> VolTag;
    typedef Tag<3> ConstVolTag;

    static NonCVTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...));
    static ConstTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const);
    static VolTag test(t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile);
    static ConstVolTag test(
                         t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const volatile);

  public:
    enum {
        IS_CONST    = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 1) != 0,
        IS_VOLATILE = (BSLMF_TAG_TO_UINT((test)((t_PROTOTYPE)0)) & 2) != 0
    };

    typedef typename If<IS_CONST, const t_TYPE, t_TYPE>::Type CType;

    typedef typename If<IS_VOLATILE, volatile CType, CType>::Type Type;
};
// }}} END GENERATED CODE
#endif  // BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES


                   // -------------------------------------
                   // class MemberFunctionPointerTraits_Imp
                   // -------------------------------------

template <class t_PROTOTYPE, class t_TEST_PROTOTYPE>
struct MemberFunctionPointerTraits_Imp {
    // Implementation of 'MemberFunctionPointerTraits', containing the actual
    // traits types.  This primary template is instantiated when 't_PROTOTYPE'
    // does not match a pointer-to-member-function type.  In actual use,
    // 't_PROTOTYPE' and 't_TEST_PROTOTYPE' are the same, but specializations
    // treat 't_PROTOTYPE' as an opaque type and 't_TEST_PROTOTYPE' as a
    // pattern match.  This redundancy is needed to work around some old
    // compiler bugs.

    enum {
        IS_MEMBER_FUNCTION_PTR = 0
    };
};

// SPECIALIZATIONS
#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES  // $var-args=14
template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only non-cv member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only const member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only volatile member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const volatile> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only const volatile member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

#elif BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// The following section is automatically generated.  **DO NOT EDIT**
// Generator command line:
//   sim_cpp11_features.pl bslmf_memberfunctionpointertraits.h
#ifndef BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT
#define BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT 14
#endif
#ifndef BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B
#define BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B                    \
        BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT
#endif
#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0
template <class t_PROTOTYPE, class t_BSLMF_RETURN, class t_TYPE>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)()> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef
        typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                       t_BSLMF_RETURN,
                                                       t_TYPE>::Type ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (
           t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04, t_ARGS_05)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12,
                                                                  t_ARGS_13)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13,
          class t_ARGS_14>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12,
                                                                  t_ARGS_13,
                                                                  t_ARGS_14)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13,
                                                           t_ARGS_14>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13,
                              t_ARGS_14>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0
template <class t_PROTOTYPE, class t_BSLMF_RETURN, class t_TYPE>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)() const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef
        typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                       t_BSLMF_RETURN,
                                                       t_TYPE>::Type ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02) const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03) const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04)
        const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (
              t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04, t_ARGS_05)
        const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12,
                                                                  t_ARGS_13)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13,
          class t_ARGS_14>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12,
                                                                  t_ARGS_13,
                                                                  t_ARGS_14)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13,
                                                           t_ARGS_14>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13,
                              t_ARGS_14>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0
template <class t_PROTOTYPE, class t_BSLMF_RETURN, class t_TYPE>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)() volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef
        typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                       t_BSLMF_RETURN,
                                                       t_TYPE>::Type ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (
             t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07,
                                                         t_ARGS_08) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07,
                                                         t_ARGS_08,
                                                         t_ARGS_09) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07,
                                                         t_ARGS_08,
                                                         t_ARGS_09,
                                                         t_ARGS_10) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07,
                                                         t_ARGS_08,
                                                         t_ARGS_09,
                                                         t_ARGS_10,
                                                         t_ARGS_11) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07,
                                                         t_ARGS_08,
                                                         t_ARGS_09,
                                                         t_ARGS_10,
                                                         t_ARGS_11,
                                                         t_ARGS_12) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07,
                                                         t_ARGS_08,
                                                         t_ARGS_09,
                                                         t_ARGS_10,
                                                         t_ARGS_11,
                                                         t_ARGS_12,
                                                         t_ARGS_13) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13,
          class t_ARGS_14>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(
                                                         t_ARGS_01,
                                                         t_ARGS_02,
                                                         t_ARGS_03,
                                                         t_ARGS_04,
                                                         t_ARGS_05,
                                                         t_ARGS_06,
                                                         t_ARGS_07,
                                                         t_ARGS_08,
                                                         t_ARGS_09,
                                                         t_ARGS_10,
                                                         t_ARGS_11,
                                                         t_ARGS_12,
                                                         t_ARGS_13,
                                                         t_ARGS_14) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13,
                                                           t_ARGS_14>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13,
                              t_ARGS_14>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0
template <class t_PROTOTYPE, class t_BSLMF_RETURN, class t_TYPE>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)()
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef
        typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                       t_BSLMF_RETURN,
                                                       t_TYPE>::Type ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 0

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 1

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02) const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 2

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03)
        const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 3

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04)
        const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 4

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (
              t_TYPE::*)(t_ARGS_01, t_ARGS_02, t_ARGS_03, t_ARGS_04, t_ARGS_05)
        const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 5

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 6

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 7

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 8

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 9

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 10

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 11

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 12

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12,
                                                                  t_ARGS_13)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 13

#if BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14
template <class t_PROTOTYPE,
          class t_BSLMF_RETURN,
          class t_TYPE,
          class t_ARGS_01,
          class t_ARGS_02,
          class t_ARGS_03,
          class t_ARGS_04,
          class t_ARGS_05,
          class t_ARGS_06,
          class t_ARGS_07,
          class t_ARGS_08,
          class t_ARGS_09,
          class t_ARGS_10,
          class t_ARGS_11,
          class t_ARGS_12,
          class t_ARGS_13,
          class t_ARGS_14>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS_01,
                                                                  t_ARGS_02,
                                                                  t_ARGS_03,
                                                                  t_ARGS_04,
                                                                  t_ARGS_05,
                                                                  t_ARGS_06,
                                                                  t_ARGS_07,
                                                                  t_ARGS_08,
                                                                  t_ARGS_09,
                                                                  t_ARGS_10,
                                                                  t_ARGS_11,
                                                                  t_ARGS_12,
                                                                  t_ARGS_13,
                                                                  t_ARGS_14)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS_01,
                                                           t_ARGS_02,
                                                           t_ARGS_03,
                                                           t_ARGS_04,
                                                           t_ARGS_05,
                                                           t_ARGS_06,
                                                           t_ARGS_07,
                                                           t_ARGS_08,
                                                           t_ARGS_09,
                                                           t_ARGS_10,
                                                           t_ARGS_11,
                                                           t_ARGS_12,
                                                           t_ARGS_13,
                                                           t_ARGS_14>::Type
                                             ClassType;
    typedef t_BSLMF_RETURN                   ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13,
                              t_ARGS_14>::Type ArgumentList;
};
#endif  // BSLMF_MEMBERFUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_B >= 14

#else   // BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.
template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const volatile> {
    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

// }}} END GENERATED CODE
#endif  // BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES

#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           noexcept> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only non-cv member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const noexcept> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only const member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile noexcept> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only volatile member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };

    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const volatile noexcept> {
    // Specialization to determine the traits of member functions.  A modern
    // compiler will match only const volatile member functions, but some older
    // compilers might match this to any member function.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };
    typedef typename MemberFunctionPointerTraits_ClassType<t_PROTOTYPE,
                                                           t_BSLMF_RETURN,
                                                           t_TYPE,
                                                           t_ARGS...>::Type
                                               ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};
#endif  // BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

#ifdef BSLS_COMPILERFEATURES_SUPPORT_REF_QUALIFIERS

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)&> {
    // Specialization to determine the traits of a pointer to lvalref-qualified
    // member function.  The workarounds for older compilers are not needed
    // because only more modern compilers support ref-qualified member
    // functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef t_TYPE                             ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const&> {
    // Specialization to determine the traits of a pointer to const
    // lvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef const t_TYPE                       ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile&> {
    // Specialization to determine the traits of a pointer to volatile
    // lvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef volatile t_TYPE                    ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const volatile&> {
    // Specialization to determine the traits of a pointer to const volatile
    // lvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 0
    };
    typedef const volatile t_TYPE              ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) &
                                           noexcept> {
    // Specialization to determine the traits of a pointer to lvalref-qualified
    // member function.  The workarounds for older compilers are not needed
    // because only more modern compilers support ref-qualified member
    // functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };
    typedef t_TYPE                             ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const & noexcept> {
    // Specialization to determine the traits of a pointer to const
    // lvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };
    typedef const t_TYPE                       ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile & noexcept> {
    // Specialization to determine the traits of a pointer to volatile
    // lvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };
    typedef volatile t_TYPE                    ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const volatile & noexcept> {
    // Specialization to determine the traits of a pointer to const volatile
    // lvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 1,
        IS_RVALREF_QUALIFIED   = 0,
        IS_NOEXCEPT            = 1
    };
    typedef const volatile t_TYPE              ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

#endif  // BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) &&> {
    // Specialization to determine the traits of a pointer to rvalref-qualified
    // member function.  The workarounds for older compilers are not needed
    // because only more modern compilers support ref-qualified member
    // functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 0
    };
    typedef t_TYPE                             ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const&&> {
    // Specialization to determine the traits of a pointer to const
    // rvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 0
    };
    typedef const t_TYPE                       ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile&&> {
    // Specialization to determine the traits of a pointer to volatile
    // rvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 0
    };
    typedef volatile t_TYPE                    ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...)
                                           const volatile&&> {
    // Specialization to determine the traits of a pointer to const volatile
    // rvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 0
    };
    typedef const volatile t_TYPE              ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<t_PROTOTYPE,
                                       t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) &&
                                           noexcept> {
    // Specialization to determine the traits of a pointer to rvalref-qualified
    // member function.  The workarounds for older compilers are not needed
    // because only more modern compilers support ref-qualified member
    // functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 1
    };
    typedef t_TYPE                             ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const && noexcept> {
    // Specialization to determine the traits of a pointer to const
    // rvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 1
    };
    typedef const t_TYPE                       ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) volatile && noexcept> {
    // Specialization to determine the traits of a pointer to volatile
    // rvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 1
    };
    typedef volatile t_TYPE                    ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};

template <class    t_PROTOTYPE,
          class    t_BSLMF_RETURN,
          class    t_TYPE,
          class... t_ARGS>
struct MemberFunctionPointerTraits_Imp<
    t_PROTOTYPE,
    t_BSLMF_RETURN (t_TYPE::*)(t_ARGS...) const volatile && noexcept> {
    // Specialization to determine the traits of a pointer to const volatile
    // rvalref-qualified member function.  The workarounds for older compilers
    // are not needed because only more modern compilers support ref-qualified
    // member functions.

    enum {
        IS_MEMBER_FUNCTION_PTR = 1,
        IS_LVALREF_QUALIFIED   = 0,
        IS_RVALREF_QUALIFIED   = 1,
        IS_NOEXCEPT            = 1
    };
    typedef const volatile t_TYPE              ClassType;
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
};
#endif  // BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

#endif  // BSLS_COMPILERFEATURES_SUPPORT_REF_QUALIFIERS

}  // close package namespace

#ifndef BDE_OPENSOURCE_PUBLICATION  // BACKWARD_COMPATIBILITY
// ============================================================================
//                           BACKWARD COMPATIBILITY
// ============================================================================

#ifdef bslmf_MemberFunctionPointerTraits
#undef bslmf_MemberFunctionPointerTraits
#endif
#define bslmf_MemberFunctionPointerTraits bslmf::MemberFunctionPointerTraits
    // This alias is defined for backward compatibility.

#ifdef bslmf_IsMemberFunctionPointer
#undef bslmf_IsMemberFunctionPointer
#endif
#define bslmf_IsMemberFunctionPointer bslmf::IsMemberFunctionPointer
    // This alias is defined for backward compatibility.

#ifdef bslmf_MemberFunctionPointerTraitsImp
#undef bslmf_MemberFunctionPointerTraitsImp
#endif
#define bslmf_MemberFunctionPointerTraitsImp  \
        bslmf::MemberFunctionPointerTraits_Imp
    // This alias is defined for backward compatibility.
#endif  // BDE_OPENSOURCE_PUBLICATION -- BACKWARD_COMPATIBILITY

}  // close enterprise namespace

#endif

// ----------------------------------------------------------------------------
// Copyright 2013-2019 Bloomberg Finance L.P.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------- END-OF-FILE ----------------------------------