// bslstl_function_invokerutil_cpp03.h                                -*-C++-*-

// Automatically generated file.  **DO NOT EDIT**

#ifndef INCLUDED_BSLSTL_FUNCTION_INVOKERUTIL_CPP03
#define INCLUDED_BSLSTL_FUNCTION_INVOKERUTIL_CPP03

//@PURPOSE: Provide C++03 implementation for bslstl_function_invokerutil.h
//
//@CLASSES: See bslstl_function_invokerutil.h for list of classes
//
//@SEE_ALSO: bslstl_function_invokerutil
//
//@DESCRIPTION:  This component is the C++03 translation of a C++11 component,
// generated by the 'sim_cpp11_features.pl' program.  If the original header
// contains any specially delimited regions of C++11 code, then this generated
// file contains the C++03 equivalent, i.e., with variadic templates expanded
// and rvalue-references replaced by 'bslmf::MovableRef' objects.  The header
// code in this file is designed to be '#include'd into the original header
// when compiling with a C++03 compiler.  If there are no specially delimited
// regions of C++11 code, then this header contains no code and is not
// '#include'd in the original header.
//
// Generated on Thu Oct 21 10:11:37 2021
// Command line: sim_cpp11_features.pl bslstl_function_invokerutil.h

#ifdef COMPILING_BSLSTL_FUNCTION_INVOKERUTIL_H

#ifndef BSLS_PLATFORM_CMP_SUN
#define BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET, X) static_cast<RET>(X)
#else
#define BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET, X) (RET)(X)
#endif

#if defined(BSLMF_INVOKERESULT_SUPPORT_CPP17_SEMANTICS)      \
 && defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE)          \
 && defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) \
 && defined(BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY)
#define BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE
#endif

namespace BloombergLP {
namespace bslstl {

#ifdef BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE

template <class PROTOTYPE, class FUNC>
struct Function_InvokerUtil_IsFuncInvocable;
    // forward declaration

#endif

                        // ===========================
                        // struct Function_InvokerUtil
                        // ===========================

struct Function_InvokerUtil {
    // This struct is a namespace containing a single function template,
    // 'invokerForFunc', that returns a pointer to a function that is used to
    // invoke a callable object of a particular type.

    // TYPES
    enum {
        // Enumeration of the different types of callable objects.

        e_Null,
        e_FunctionPtr,
        e_MemFunctionPtr,
        e_MemDataPtr,
        e_InplaceFunctor,
        e_OutofplaceFunctor
    };

    typedef Function_Rep::GenericInvoker GenericInvoker;
        // Generic function pointer.  This type is as close as we can get to
        // 'void *' for function pointers.

#ifdef BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE
    template <class PROTOTYPE, class FUNC>
    struct IsFuncInvocable
    : Function_InvokerUtil_IsFuncInvocable<PROTOTYPE, FUNC> {
        // This 'struct' template implements a Boolean metafunction that
        // publicly inherits from 'bsl::true_type' if an object of the
        // specified 'FUNC' type is invocable under the specified 'PROTOTYPE',
        // and publicly inherits from 'bsl::false_type' otherwise.  An object
        // of 'FUNC' type is invocable under the 'PROTOTYPE' if it is
        // Lvalue-Callable with the arguments of the 'PROTOTYPE' (as forwarded
        // by the facilities of 'bslmf_forwardingtype), and returns an object
        // of type explicitly convertible to the return type of the
        // 'PROTOTYPE'.  If the return type of the 'PROTOTYPE' is 'void', then
        // any type is considered explicitly convertible to the return type of
        // the 'PROTOTYPE'.  This 'struct' template requires 'PROTOTYPE" to be
        // an unqualified function type.
        //
        // Note that 'IsFuncInvocable' is qualitatively different than
        // 'std::is_invocable_r', in that it makes concessions for supporting
        // legacy behavior of 'bsl::function'.
        // 'std::is_invocable_r<RET, FUNC, ARGS...>' requires that the return
        // type of the invocation of 'FUNC' with 'ARGS...' be implicitly
        // convertible to 'RET', as opposed to explicitly convertible.
        // Further, the use of 'bslmf::ForwardingType' to forward arguments in
        // the invoker of a 'bsl::function' creates qualitatively different
        // behavior than the argument forwarding mechanism used by the standard
        // 'INVOKE' pseudo-expression.
    };
#endif

    // CLASS METHODS
    template <class PROTOTYPE>
    static GenericInvoker *invokerForFunc(const bsl::nullptr_t&);
        // Return a null pointer.  Note that template argument 'PROTOTYPE' must
        // be supplied excplicitly, as there is no way to deduce it from the
        // function arguments.

    template <class PROTOTYPE, class FUNC>
    static GenericInvoker *invokerForFunc(const FUNC& f);
        // Return a pointer to the invoker for a callable object of (template
        // paramter) type 'FUNC'.  If the specified 'f' object is a null
        // pointer or null pointer-to-member, return a null pointer.  Note that
        // template argument 'PROTOTYPE' must be supplied excplicitly, as there
        // is no way to deduce it from the function arguments.
};

               // =============================================
               // template struct Function_InvokerUtilNullCheck
               // =============================================

template <class FUNC>
struct Function_InvokerUtilNullCheck {
    // Provides an 'isNull' static method that that returns whether or not its
    // argument is "null", i.e., it cannot be invoked.  For must 'FUNC' types
    // 'isNull' always returns 'false' as every instance of 'FUNC' is
    // invocable.  However, specializations of this class, especially for
    // pointer types, have 'isNull' functions that sometimes return 'true'.
    // This class is a customization point: types outside of this component can
    // (but rarely should) specialize this template.  In particular,
    // 'bslstl_function' contains a specialization for 'bsl::function'.

    // CLASS METHODS
    static bool isNull(const FUNC&);
        // Return 'false'.
};

template <class FUNC>
struct Function_InvokerUtilNullCheck<FUNC *> {
    // Specialization of dispatcher for pointer objects.

    // CLASS METHODS
    static bool isNull(FUNC *f);
        // Return 'true' if the specified 'f' pointer is null; otherwise
        // 'false'.
};

template <class CLASS, class MEMTYPE>
struct Function_InvokerUtilNullCheck<MEMTYPE CLASS::*> {
    // Specialization of dispatcher for pointer-to-member objects.

  public:
    // CLASS METHODS
    static bool isNull(MEMTYPE CLASS::* f);
        // Return 'true' if the specified 'f' pointer to member is null;
        // otherwise 'false'.
};

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslstl_function_invokerutil.h
#ifndef BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT
#define BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT 13
#endif
#ifndef BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A
#define BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT
#endif


#ifdef BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE

template <class VOID_TYPE,
          class RET,
          class FUNC
#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
        , class ARGS_0 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
        , class ARGS_1 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
        , class ARGS_2 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
        , class ARGS_3 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
        , class ARGS_4 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
        , class ARGS_5 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
        , class ARGS_6 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
        , class ARGS_7 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
        , class ARGS_8 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
        , class ARGS_9 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
        , class ARGS_10 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
        , class ARGS_11 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
        , class ARGS_12 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
        , class = BSLS_COMPILERFEATURES_NILT>
struct Function_InvokerUtil_IsFuncInvocableImp;


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
template <class RET, class FUNC>
struct Function_InvokerUtil_IsFuncInvocable<RET(), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
template <class RET, class FUNC, class ARGS_01>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06,
                                                ARGS_07), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06,
                                                ARGS_07,
                                                ARGS_08), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06,
                                                ARGS_07,
                                                ARGS_08,
                                                ARGS_09), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06,
                                                ARGS_07,
                                                ARGS_08,
                                                ARGS_09,
                                                ARGS_10), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06,
                                                ARGS_07,
                                                ARGS_08,
                                                ARGS_09,
                                                ARGS_10,
                                                ARGS_11), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10,
                                                           ARGS_11> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06,
                                                ARGS_07,
                                                ARGS_08,
                                                ARGS_09,
                                                ARGS_10,
                                                ARGS_11,
                                                ARGS_12), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10,
                                                           ARGS_11,
                                                           ARGS_12> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS_01,
                                                ARGS_02,
                                                ARGS_03,
                                                ARGS_04,
                                                ARGS_05,
                                                ARGS_06,
                                                ARGS_07,
                                                ARGS_08,
                                                ARGS_09,
                                                ARGS_10,
                                                ARGS_11,
                                                ARGS_12,
                                                ARGS_13), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10,
                                                           ARGS_11,
                                                           ARGS_12,
                                                           ARGS_13> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13



template <class ARG>
struct Function_InvokerUtil_ForwardType;

template <class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertible;

template <class FUNC
#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
        , class ARGS_0 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
        , class ARGS_1 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
        , class ARGS_2 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
        , class ARGS_3 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
        , class ARGS_4 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
        , class ARGS_5 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
        , class ARGS_6 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
        , class ARGS_7 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
        , class ARGS_8 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
        , class ARGS_9 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
        , class ARGS_10 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
        , class ARGS_11 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
        , class ARGS_12 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
        , class = BSLS_COMPILERFEATURES_NILT>
struct Function_InvokerUtil_ResultType;


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
template <class VOID_TYPE, class RET, class FUNC>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06,
                                                  class ARGS_07>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06,
                                                                     ARGS_07
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06,
                                                  class ARGS_07,
                                                  class ARGS_08>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06,
                                                                     ARGS_07,
                                                                     ARGS_08
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06,
                                                  class ARGS_07,
                                                  class ARGS_08,
                                                  class ARGS_09>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06,
                                                                     ARGS_07,
                                                                     ARGS_08,
                                                                     ARGS_09
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06,
                                                  class ARGS_07,
                                                  class ARGS_08,
                                                  class ARGS_09,
                                                  class ARGS_10>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06,
                                                                     ARGS_07,
                                                                     ARGS_08,
                                                                     ARGS_09,
                                                                     ARGS_10
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06,
                                                  class ARGS_07,
                                                  class ARGS_08,
                                                  class ARGS_09,
                                                  class ARGS_10,
                                                  class ARGS_11>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06,
                                                                     ARGS_07,
                                                                     ARGS_08,
                                                                     ARGS_09,
                                                                     ARGS_10,
                                                                     ARGS_11
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06,
                                                  class ARGS_07,
                                                  class ARGS_08,
                                                  class ARGS_09,
                                                  class ARGS_10,
                                                  class ARGS_11,
                                                  class ARGS_12>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06,
                                                                     ARGS_07,
                                                                     ARGS_08,
                                                                     ARGS_09,
                                                                     ARGS_10,
                                                                     ARGS_11,
                                                                     ARGS_12
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13
template <class VOID_TYPE, class RET, class FUNC, class ARGS_01,
                                                  class ARGS_02,
                                                  class ARGS_03,
                                                  class ARGS_04,
                                                  class ARGS_05,
                                                  class ARGS_06,
                                                  class ARGS_07,
                                                  class ARGS_08,
                                                  class ARGS_09,
                                                  class ARGS_10,
                                                  class ARGS_11,
                                                  class ARGS_12,
                                                  class ARGS_13>
struct Function_InvokerUtil_IsFuncInvocableImp<VOID_TYPE, RET, FUNC, ARGS_01,
                                                                     ARGS_02,
                                                                     ARGS_03,
                                                                     ARGS_04,
                                                                     ARGS_05,
                                                                     ARGS_06,
                                                                     ARGS_07,
                                                                     ARGS_08,
                                                                     ARGS_09,
                                                                     ARGS_10,
                                                                     ARGS_11,
                                                                     ARGS_12,
                                                                     ARGS_13
                                                          > : bsl::false_type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
template <class RET, class FUNC>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC>::type>::type,
    RET,
    FUNC>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
template <class RET, class FUNC, class ARGS_01>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01>::type>::type,
    RET,
    FUNC,
    ARGS_01>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06,
                                                       ARGS_07>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06,
                                                         ARGS_07>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06,
                                                       ARGS_07,
                                                       ARGS_08>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06,
                                                         ARGS_07,
                                                         ARGS_08>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06,
                                                       ARGS_07,
                                                       ARGS_08,
                                                       ARGS_09>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06,
                                                         ARGS_07,
                                                         ARGS_08,
                                                         ARGS_09>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06,
                                                       ARGS_07,
                                                       ARGS_08,
                                                       ARGS_09,
                                                       ARGS_10>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06,
                                                         ARGS_07,
                                                         ARGS_08,
                                                         ARGS_09,
                                                         ARGS_10>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06,
                                                       ARGS_07,
                                                       ARGS_08,
                                                       ARGS_09,
                                                       ARGS_10,
                                                       ARGS_11>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10,
    ARGS_11>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06,
                                                         ARGS_07,
                                                         ARGS_08,
                                                         ARGS_09,
                                                         ARGS_10,
                                                         ARGS_11>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06,
                                                       ARGS_07,
                                                       ARGS_08,
                                                       ARGS_09,
                                                       ARGS_10,
                                                       ARGS_11,
                                                       ARGS_12>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10,
    ARGS_11,
    ARGS_12>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06,
                                                         ARGS_07,
                                                         ARGS_08,
                                                         ARGS_09,
                                                         ARGS_10,
                                                         ARGS_11,
                                                         ARGS_12>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13
template <class RET, class FUNC, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                       ARGS_02,
                                                       ARGS_03,
                                                       ARGS_04,
                                                       ARGS_05,
                                                       ARGS_06,
                                                       ARGS_07,
                                                       ARGS_08,
                                                       ARGS_09,
                                                       ARGS_10,
                                                       ARGS_11,
                                                       ARGS_12,
                                                       ARGS_13>::type>::type,
    RET,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10,
    ARGS_11,
    ARGS_12,
    ARGS_13>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                                         ARGS_02,
                                                         ARGS_03,
                                                         ARGS_04,
                                                         ARGS_05,
                                                         ARGS_06,
                                                         ARGS_07,
                                                         ARGS_08,
                                                         ARGS_09,
                                                         ARGS_10,
                                                         ARGS_11,
                                                         ARGS_12,
                                                         ARGS_13>::type,
          RET> >::type {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13



template <class VOID_TYPE,
          class FUNC
#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
        , class ARGS_0 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
        , class ARGS_1 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
        , class ARGS_2 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
        , class ARGS_3 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
        , class ARGS_4 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
        , class ARGS_5 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
        , class ARGS_6 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
        , class ARGS_7 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
        , class ARGS_8 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
        , class ARGS_9 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
        , class ARGS_10 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
        , class ARGS_11 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
        , class ARGS_12 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
        , class = BSLS_COMPILERFEATURES_NILT>
struct Function_InvokerUtil_ResultTypeImp;


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
template <class FUNC>
struct Function_InvokerUtil_ResultType<FUNC>
: Function_InvokerUtil_ResultTypeImp<void, FUNC> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
template <class FUNC, class ARGS_01>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
template <class FUNC, class ARGS_01,
                      class ARGS_02>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06,
                                             ARGS_07>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06,
                                                 ARGS_07> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06,
                                             ARGS_07,
                                             ARGS_08>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06,
                                                 ARGS_07,
                                                 ARGS_08> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06,
                                             ARGS_07,
                                             ARGS_08,
                                             ARGS_09>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06,
                                                 ARGS_07,
                                                 ARGS_08,
                                                 ARGS_09> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06,
                                             ARGS_07,
                                             ARGS_08,
                                             ARGS_09,
                                             ARGS_10>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06,
                                                 ARGS_07,
                                                 ARGS_08,
                                                 ARGS_09,
                                                 ARGS_10> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10,
                      class ARGS_11>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06,
                                             ARGS_07,
                                             ARGS_08,
                                             ARGS_09,
                                             ARGS_10,
                                             ARGS_11>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06,
                                                 ARGS_07,
                                                 ARGS_08,
                                                 ARGS_09,
                                                 ARGS_10,
                                                 ARGS_11> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10,
                      class ARGS_11,
                      class ARGS_12>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06,
                                             ARGS_07,
                                             ARGS_08,
                                             ARGS_09,
                                             ARGS_10,
                                             ARGS_11,
                                             ARGS_12>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06,
                                                 ARGS_07,
                                                 ARGS_08,
                                                 ARGS_09,
                                                 ARGS_10,
                                                 ARGS_11,
                                                 ARGS_12> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10,
                      class ARGS_11,
                      class ARGS_12,
                      class ARGS_13>
struct Function_InvokerUtil_ResultType<FUNC, ARGS_01,
                                             ARGS_02,
                                             ARGS_03,
                                             ARGS_04,
                                             ARGS_05,
                                             ARGS_06,
                                             ARGS_07,
                                             ARGS_08,
                                             ARGS_09,
                                             ARGS_10,
                                             ARGS_11,
                                             ARGS_12,
                                             ARGS_13>
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS_01,
                                                 ARGS_02,
                                                 ARGS_03,
                                                 ARGS_04,
                                                 ARGS_05,
                                                 ARGS_06,
                                                 ARGS_07,
                                                 ARGS_08,
                                                 ARGS_09,
                                                 ARGS_10,
                                                 ARGS_11,
                                                 ARGS_12,
                                                 ARGS_13> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13



#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
template <class VOID_TYPE, class FUNC>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
template <class VOID_TYPE, class FUNC, class ARGS_01>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06,
                                       class ARGS_07>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06,
                                       class ARGS_07,
                                       class ARGS_08>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06,
                                       class ARGS_07,
                                       class ARGS_08,
                                       class ARGS_09>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06,
                                       class ARGS_07,
                                       class ARGS_08,
                                       class ARGS_09,
                                       class ARGS_10>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06,
                                       class ARGS_07,
                                       class ARGS_08,
                                       class ARGS_09,
                                       class ARGS_10,
                                       class ARGS_11>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10,
                                                           ARGS_11> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06,
                                       class ARGS_07,
                                       class ARGS_08,
                                       class ARGS_09,
                                       class ARGS_10,
                                       class ARGS_11,
                                       class ARGS_12>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10,
                                                           ARGS_11,
                                                           ARGS_12> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13
template <class VOID_TYPE, class FUNC, class ARGS_01,
                                       class ARGS_02,
                                       class ARGS_03,
                                       class ARGS_04,
                                       class ARGS_05,
                                       class ARGS_06,
                                       class ARGS_07,
                                       class ARGS_08,
                                       class ARGS_09,
                                       class ARGS_10,
                                       class ARGS_11,
                                       class ARGS_12,
                                       class ARGS_13>
struct Function_InvokerUtil_ResultTypeImp<VOID_TYPE, FUNC, ARGS_01,
                                                           ARGS_02,
                                                           ARGS_03,
                                                           ARGS_04,
                                                           ARGS_05,
                                                           ARGS_06,
                                                           ARGS_07,
                                                           ARGS_08,
                                                           ARGS_09,
                                                           ARGS_10,
                                                           ARGS_11,
                                                           ARGS_12,
                                                           ARGS_13> {
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0
template <class FUNC>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        >::type,
    FUNC>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1
template <class FUNC, class ARGS_01>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type>::type,
    FUNC,
    ARGS_01>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2
template <class FUNC, class ARGS_01,
                      class ARGS_02>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_07>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_07>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_08>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_08>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_09>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_09>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_10>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_10>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10,
                      class ARGS_11>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_10>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_11>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10,
    ARGS_11>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_10>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_11>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10,
                      class ARGS_11,
                      class ARGS_12>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_10>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_11>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_12>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10,
    ARGS_11,
    ARGS_12>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_10>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_11>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_12>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13
template <class FUNC, class ARGS_01,
                      class ARGS_02,
                      class ARGS_03,
                      class ARGS_04,
                      class ARGS_05,
                      class ARGS_06,
                      class ARGS_07,
                      class ARGS_08,
                      class ARGS_09,
                      class ARGS_10,
                      class ARGS_11,
                      class ARGS_12,
                      class ARGS_13>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_10>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_11>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_12>::Type,
        typename Function_InvokerUtil_ForwardType<ARGS_13>::Type>::type,
    FUNC,
    ARGS_01,
    ARGS_02,
    ARGS_03,
    ARGS_04,
    ARGS_05,
    ARGS_06,
    ARGS_07,
    ARGS_08,
    ARGS_09,
    ARGS_10,
    ARGS_11,
    ARGS_12,
    ARGS_13>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS_01>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_02>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_03>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_04>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_05>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_06>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_07>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_08>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_09>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_10>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_11>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_12>::Type,
      typename Function_InvokerUtil_ForwardType<ARGS_13>::Type> {

};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_A >= 13



template <class VOID_TYPE, class ARG>
struct Function_InvokerUtil_ForwardTypeImp;

template <class ARG>
struct Function_InvokerUtil_ForwardType
: Function_InvokerUtil_ForwardTypeImp<void, ARG> {
};


template <class VOID_TYPE, class ARG>
struct Function_InvokerUtil_ForwardTypeImp {
};

template <class ARG>
struct Function_InvokerUtil_ForwardTypeImp<
    typename bslmf::VoidType<decltype(
        bslmf::ForwardingTypeUtil<ARG>::forwardToTarget(
            std::declval<typename bsl::add_lvalue_reference<
                typename bslmf::ForwardingType<ARG>::Type>::type>()))>::type,
    ARG> {

    typedef decltype(bslmf::ForwardingTypeUtil<ARG>::forwardToTarget(
        std::declval<typename bsl::add_lvalue_reference<
            typename bslmf::ForwardingType<ARG>::Type>::type>())) Type;
};


template <class VOID_TYPE, class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertibleImp;

template <class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertible
: Function_InvokerUtil_IsExplicitlyConvertibleImp<void, FROM, TO> {
};


template <class VOID_TYPE, class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertibleImp :  bsl::false_type {
};

template <class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertibleImp<
    typename bslmf::VoidType<decltype(
        static_cast<TO>(std::declval<FROM>()))>::type,
    FROM,
    TO> : bsl::true_type {
};

#endif
#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.


#ifdef BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE

template <class VOID_TYPE, class RET, class FUNC, class... ARGS>
struct Function_InvokerUtil_IsFuncInvocableImp;

template <class RET, class FUNC, class... ARGS>
struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS...), FUNC>
: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS...> {
};


template <class ARG>
struct Function_InvokerUtil_ForwardType;

template <class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertible;

template <class FUNC, class... ARGS>
struct Function_InvokerUtil_ResultType;

template <class VOID_TYPE, class RET, class FUNC, class... ARGS>
struct Function_InvokerUtil_IsFuncInvocableImp : bsl::false_type {
};

template <class RET, class FUNC, class... ARGS>
struct Function_InvokerUtil_IsFuncInvocableImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ResultType<FUNC, ARGS...>::type>::type,
    RET,
    FUNC,
    ARGS...>
: bsl::conditional<
      bsl::is_void<RET>::value,
      bsl::true_type,
      Function_InvokerUtil_IsExplicitlyConvertible<
          typename Function_InvokerUtil_ResultType<FUNC, ARGS...>::type,
          RET> >::type {
};


template <class VOID_TYPE, class FUNC, class... ARGS>
struct Function_InvokerUtil_ResultTypeImp;

template <class FUNC, class... ARGS>
struct Function_InvokerUtil_ResultType
: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS...> {
};


template <class VOID_TYPE, class FUNC, class... ARGS>
struct Function_InvokerUtil_ResultTypeImp {
};

template <class FUNC, class... ARGS>
struct Function_InvokerUtil_ResultTypeImp<
    typename bslmf::VoidType<
        typename Function_InvokerUtil_ForwardType<ARGS>::Type...>::type,
    FUNC,
    ARGS...>
: bsl::invoke_result<
      typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
                                             UnwrappedType<FUNC>::type>::type,
      typename Function_InvokerUtil_ForwardType<ARGS>::Type...> {

};


template <class VOID_TYPE, class ARG>
struct Function_InvokerUtil_ForwardTypeImp;

template <class ARG>
struct Function_InvokerUtil_ForwardType
: Function_InvokerUtil_ForwardTypeImp<void, ARG> {
};


template <class VOID_TYPE, class ARG>
struct Function_InvokerUtil_ForwardTypeImp {
};

template <class ARG>
struct Function_InvokerUtil_ForwardTypeImp<
    typename bslmf::VoidType<decltype(
        bslmf::ForwardingTypeUtil<ARG>::forwardToTarget(
            std::declval<typename bsl::add_lvalue_reference<
                typename bslmf::ForwardingType<ARG>::Type>::type>()))>::type,
    ARG> {

    typedef decltype(bslmf::ForwardingTypeUtil<ARG>::forwardToTarget(
        std::declval<typename bsl::add_lvalue_reference<
            typename bslmf::ForwardingType<ARG>::Type>::type>())) Type;
};


template <class VOID_TYPE, class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertibleImp;

template <class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertible
: Function_InvokerUtil_IsExplicitlyConvertibleImp<void, FROM, TO> {
};


template <class VOID_TYPE, class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertibleImp :  bsl::false_type {
};

template <class FROM, class TO>
struct Function_InvokerUtil_IsExplicitlyConvertibleImp<
    typename bslmf::VoidType<decltype(
        static_cast<TO>(std::declval<FROM>()))>::type,
    FROM,
    TO> : bsl::true_type {
};

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

               // =============================================
               // template struct Function_InvokerUtil_Dispatch
               // =============================================

template <int INVOCATION_TYPE, class PROTOTYPE, class FUNC>
struct Function_InvokerUtil_Dispatch;
    // Specializations of this class contain a static 'invoke' method that can
    // invoke a callable object of type 'FUNC', converting each argument in
    // 'PROTOTYPE' (a function prototype) to the corresponding argument in the
    // invocation of the callable object and converting the return value of the
    // invocation to the return type of 'PROTOTYPE'.  The 'INVOCATION_TYPE'
    // specifies the category of callable object: pointer to function, pointer
    // to member function, pointer to data member, inplace functor (i.e., one
    // that qualifies for the small-object optimization) and out-of-place
    // functor (i.e., one that is not stored in the small-object buffer).

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslstl_function_invokerutil.h
#ifndef BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT
#define BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT 13
#endif
#ifndef BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B
#define BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT
#endif

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0
template <class FUNC, class RET>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(), FUNC> {

    static RET invoke(const Function_Rep                            *rep);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1
template <class FUNC, class RET, class ARGS_01>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11,
                                         ARGS_12), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11,
                                         ARGS_12,
                                         ARGS_13), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12,
                      typename bslmf::ForwardingType<ARGS_13>::Type args_13);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0
template <class FUNC, class RET, class ARG0>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1
template <class FUNC, class RET, class ARG0, class ARGS_01>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06,
                                               ARGS_07), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06,
                                               ARGS_07,
                                               ARGS_08), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06,
                                               ARGS_07,
                                               ARGS_08,
                                               ARGS_09), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06,
                                               ARGS_07,
                                               ARGS_08,
                                               ARGS_09,
                                               ARGS_10), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06,
                                               ARGS_07,
                                               ARGS_08,
                                               ARGS_09,
                                               ARGS_10,
                                               ARGS_11), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                        typename bslmf::ForwardingType<ARGS_11>::Type args_11);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                        typename bslmf::ForwardingType<ARGS_11>::Type args_11);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06,
                                               ARGS_07,
                                               ARGS_08,
                                               ARGS_09,
                                               ARGS_10,
                                               ARGS_11,
                                               ARGS_12), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                        typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                        typename bslmf::ForwardingType<ARGS_12>::Type args_12);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                        typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                        typename bslmf::ForwardingType<ARGS_12>::Type args_12);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS_01,
                                               ARGS_02,
                                               ARGS_03,
                                               ARGS_04,
                                               ARGS_05,
                                               ARGS_06,
                                               ARGS_07,
                                               ARGS_08,
                                               ARGS_09,
                                               ARGS_10,
                                               ARGS_11,
                                               ARGS_12,
                                               ARGS_13), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                        typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                        typename bslmf::ForwardingType<ARGS_12>::Type args_12,
                        typename bslmf::ForwardingType<ARGS_13>::Type args_13);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                        typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                        typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                        typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                        typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                        typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                        typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                        typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                        typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                        typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                        typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                        typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                        typename bslmf::ForwardingType<ARGS_12>::Type args_12,
                        typename bslmf::ForwardingType<ARGS_13>::Type args_13);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12,
                      typename bslmf::ForwardingType<ARGS_13>::Type args_13);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13


template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                                     RET(ARG0), MEMBER_TYPE CLASS_TYPE::*> {
  private:
    typedef MEMBER_TYPE CLASS_TYPE::* Func;

    static RET invokeImp(bsl::true_type ,
                         Func                                        f,
                         typename bslmf::ForwardingType<ARG0>::Type  obj);

    static RET invokeImp(bsl::false_type ,
                         Func                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj);

  public:
    static RET invoke(const Function_Rep                         *rep,
                      typename bslmf::ForwardingType<ARG0>::Type  obj);
};

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0
template <class FUNC, class RET>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(), FUNC> {

    static RET invoke(const Function_Rep                            *rep);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1
template <class FUNC, class RET, class ARGS_01>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11,
                                         ARGS_12), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11,
                                         ARGS_12,
                                         ARGS_13), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12,
                      typename bslmf::ForwardingType<ARGS_13>::Type args_13);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0
template <class FUNC, class RET>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(), FUNC> {

    static RET invoke(const Function_Rep                            *rep);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1
template <class FUNC, class RET, class ARGS_01>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11,
                                         ARGS_12), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS_01,
                                         ARGS_02,
                                         ARGS_03,
                                         ARGS_04,
                                         ARGS_05,
                                         ARGS_06,
                                         ARGS_07,
                                         ARGS_08,
                                         ARGS_09,
                                         ARGS_10,
                                         ARGS_11,
                                         ARGS_12,
                                         ARGS_13), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS_01>::Type args_01,
                      typename bslmf::ForwardingType<ARGS_02>::Type args_02,
                      typename bslmf::ForwardingType<ARGS_03>::Type args_03,
                      typename bslmf::ForwardingType<ARGS_04>::Type args_04,
                      typename bslmf::ForwardingType<ARGS_05>::Type args_05,
                      typename bslmf::ForwardingType<ARGS_06>::Type args_06,
                      typename bslmf::ForwardingType<ARGS_07>::Type args_07,
                      typename bslmf::ForwardingType<ARGS_08>::Type args_08,
                      typename bslmf::ForwardingType<ARGS_09>::Type args_09,
                      typename bslmf::ForwardingType<ARGS_10>::Type args_10,
                      typename bslmf::ForwardingType<ARGS_11>::Type args_11,
                      typename bslmf::ForwardingType<ARGS_12>::Type args_12,
                      typename bslmf::ForwardingType<ARGS_13>::Type args_13);
};
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_B >= 13

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.

template <class FUNC, class RET, class... ARGS>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                                     RET(ARGS...), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS>::Type...  args);
};

template <class FUNC, class RET, class ARG0, class... ARGS>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                                     RET(ARG0, ARGS...), FUNC> {

  private:
    static RET invokeImp(bsl::true_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                         typename bslmf::ForwardingType<ARGS>::Type...  args);

    static RET invokeImp(bsl::false_type ,
                         FUNC                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj,
                         typename bslmf::ForwardingType<ARGS>::Type...  args);

  public:
    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARG0>::Type     obj,
                      typename bslmf::ForwardingType<ARGS>::Type...  args);
};

template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                                     RET(ARG0), MEMBER_TYPE CLASS_TYPE::*> {
  private:
    typedef MEMBER_TYPE CLASS_TYPE::* Func;

    static RET invokeImp(bsl::true_type ,
                         Func                                        f,
                         typename bslmf::ForwardingType<ARG0>::Type  obj);

    static RET invokeImp(bsl::false_type ,
                         Func                                           f,
                         typename bslmf::ForwardingType<ARG0>::Type     obj);

  public:
    static RET invoke(const Function_Rep                         *rep,
                      typename bslmf::ForwardingType<ARG0>::Type  obj);
};

template <class FUNC, class RET, class... ARGS>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                                     RET(ARGS...), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS>::Type...  args);
};

template <class FUNC, class RET, class... ARGS>
struct Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                                     RET(ARGS...), FUNC> {

    static RET invoke(const Function_Rep                            *rep,
                      typename bslmf::ForwardingType<ARGS>::Type...  args);
};

// }}} END GENERATED CODE
#endif

// ===========================================================================
//                TEMPLATE AND INLINE FUNCTION IMPLEMENTATIONS
// ===========================================================================

                        // ---------------------------
                        // struct Function_InvokerUtil
                        // ---------------------------

template <class PROTOTYPE>
inline
bslstl::Function_InvokerUtil::GenericInvoker *
bslstl::Function_InvokerUtil::invokerForFunc(const bsl::nullptr_t&)
{
    return 0;
}

template <class PROTOTYPE, class FUNC>
bslstl::Function_InvokerUtil::GenericInvoker *
bslstl::Function_InvokerUtil::invokerForFunc(const FUNC& f)
{
    typedef bslstl::Function_SmallObjectOptimization Soo;

    // Strip 'NothrowMovableWrapper' (if any) off of 'FUNC' type.
    typedef typename
        bslalg::NothrowMovableUtil::UnwrappedType<FUNC>::type UwFuncType;

    // Categorize the type of invocable corresponding to 'FUNC'.  Note that the
    // parameter to 'Soo::Inplace' is 'FUNC', not 'UwFuncType'.  That is
    // because 'Soo::Inplace' takes the wrapper into account when determining
    // whether the type should be inplace or not.
    static const int k_INVOCATION_TYPE =
        bslmf::IsFunctionPointer<UwFuncType>::value       ? e_FunctionPtr    :
        bslmf::IsMemberFunctionPointer<UwFuncType>::value ? e_MemFunctionPtr :
        bsl::is_member_pointer<UwFuncType>::value         ? e_MemDataPtr     :
        Soo::IsInplaceFunc<FUNC>::value                   ? e_InplaceFunctor :
        e_OutofplaceFunctor;

    // Instantiate the class for checking for null object
    typedef Function_InvokerUtilNullCheck<UwFuncType> NullCheckerClass;

    // Instantiate the class for dispatching the invoker
    typedef Function_InvokerUtil_Dispatch<k_INVOCATION_TYPE,
                                          PROTOTYPE,
                                          UwFuncType> DispatcherClass;

    // If a the object is "null", e.g., for a pointer, then return null.
    if (NullCheckerClass::isNull(bslalg::NothrowMovableUtil::unwrap(f)))
    {
        return 0;                                                     // RETURN
    }

    // Verify the assumption that all function pointers are the same size.
    BSLMF_ASSERT(sizeof(&DispatcherClass::invoke) ==
                 sizeof(Function_Rep::GenericInvoker *));

    // Return a pointer to the actual invoker function
    return reinterpret_cast<Function_Rep::GenericInvoker *>(
                                                 &DispatcherClass::invoke);
}

               // ---------------------------------------------
               // struct template Function_InvokerUtilNullCheck
               // ---------------------------------------------

// STATIC MEMBER FUNCTIONS

template <class FUNC>
inline
bool Function_InvokerUtilNullCheck<FUNC>::isNull(const FUNC&)
{
    return false;
}

template <class FUNC>
inline
bool Function_InvokerUtilNullCheck<FUNC *>::isNull(FUNC* f)
{
    return 0 == f;
}

template <class CLASS, class MEMTYPE>
inline
bool
Function_InvokerUtilNullCheck<MEMTYPE CLASS::*>::isNull(MEMTYPE CLASS::* f)
{
    return 0 == f;
}


               // ---------------------------------------------
               // struct template Function_InvokerUtil_Dispatch
               // ---------------------------------------------

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslstl_function_invokerutil.h
#ifndef BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT
#define BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT 13
#endif
#ifndef BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C
#define BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT
#endif

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0
template <class FUNC, class RET>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(), FUNC>::
invoke(const Function_Rep                            *rep)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f());
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1
template <class FUNC, class RET, class ARGS_01>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11,
                                  ARGS_12), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
          bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11,
                                  ARGS_12,
                                  ARGS_13), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12,
       typename bslmf::ForwardingType<ARGS_13>::Type args_13)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
          bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12),
          bslmf::ForwardingTypeUtil<ARGS_13>::forwardToTarget(args_13)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0
template <class FUNC, class RET, class ARG0>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            ));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1
template <class FUNC, class RET, class ARG0, class ARGS_01>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10,
          typename bslmf::ForwardingType<ARGS_11>::Type args_11)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
            bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11,
                                        ARGS_12), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10,
          typename bslmf::ForwardingType<ARGS_11>::Type args_11,
          typename bslmf::ForwardingType<ARGS_12>::Type args_12)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
            bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
            bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11,
                                        ARGS_12,
                                        ARGS_13), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10,
          typename bslmf::ForwardingType<ARGS_11>::Type args_11,
          typename bslmf::ForwardingType<ARGS_12>::Type args_12,
          typename bslmf::ForwardingType<ARGS_13>::Type args_13)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
            bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
            bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12),
            bslmf::ForwardingTypeUtil<ARGS_13>::forwardToTarget(args_13)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0
template <class FUNC, class RET, class ARG0>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            ));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1
template <class FUNC, class RET, class ARG0, class ARGS_01>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10,
          typename bslmf::ForwardingType<ARGS_11>::Type args_11)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
            bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11,
                                        ARGS_12), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10,
          typename bslmf::ForwardingType<ARGS_11>::Type args_11,
          typename bslmf::ForwardingType<ARGS_12>::Type args_12)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
            bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
            bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11,
                                        ARGS_12,
                                        ARGS_13), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS_01>::Type args_01,
          typename bslmf::ForwardingType<ARGS_02>::Type args_02,
          typename bslmf::ForwardingType<ARGS_03>::Type args_03,
          typename bslmf::ForwardingType<ARGS_04>::Type args_04,
          typename bslmf::ForwardingType<ARGS_05>::Type args_05,
          typename bslmf::ForwardingType<ARGS_06>::Type args_06,
          typename bslmf::ForwardingType<ARGS_07>::Type args_07,
          typename bslmf::ForwardingType<ARGS_08>::Type args_08,
          typename bslmf::ForwardingType<ARGS_09>::Type args_09,
          typename bslmf::ForwardingType<ARGS_10>::Type args_10,
          typename bslmf::ForwardingType<ARGS_11>::Type args_11,
          typename bslmf::ForwardingType<ARGS_12>::Type args_12,
          typename bslmf::ForwardingType<ARGS_13>::Type args_13)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
            bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
            bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
            bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
            bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
            bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
            bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
            bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
            bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
            bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
            bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
            bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12),
            bslmf::ForwardingTypeUtil<ARGS_13>::forwardToTarget(args_13)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0
template <class FUNC, class RET, class ARG0>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1
template <class FUNC, class RET, class ARG0, class ARGS_01>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06,
                                                            args_07));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06,
                                                            args_07,
                                                            args_08));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06,
                                                            args_07,
                                                            args_08,
                                                            args_09));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06,
                                                            args_07,
                                                            args_08,
                                                            args_09,
                                                            args_10));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06,
                                                            args_07,
                                                            args_08,
                                                            args_09,
                                                            args_10,
                                                            args_11));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11,
                                        ARGS_12), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06,
                                                            args_07,
                                                            args_08,
                                                            args_09,
                                                            args_10,
                                                            args_11,
                                                            args_12));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13
template <class FUNC, class RET, class ARG0, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS_01,
                                        ARGS_02,
                                        ARGS_03,
                                        ARGS_04,
                                        ARGS_05,
                                        ARGS_06,
                                        ARGS_07,
                                        ARGS_08,
                                        ARGS_09,
                                        ARGS_10,
                                        ARGS_11,
                                        ARGS_12,
                                        ARGS_13), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12,
       typename bslmf::ForwardingType<ARGS_13>::Type args_13)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args_01,
                                                            args_02,
                                                            args_03,
                                                            args_04,
                                                            args_05,
                                                            args_06,
                                                            args_07,
                                                            args_08,
                                                            args_09,
                                                            args_10,
                                                            args_11,
                                                            args_12,
                                                            args_13));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13


template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                              RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
invokeImp(bsl::true_type ,
          Func                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f));
}

template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                              RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
invokeImp(bsl::false_type ,
          Func                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f));
}

template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                              RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
invoke(const Function_Rep                         *rep,
       typename bslmf::ForwardingType<ARG0>::Type  obj)
{
    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            const volatile CLASS_TYPE *
        >::type IsDirect;

    Func f = *rep->targetRaw<Func, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, invokeImp(IsDirect(), f, obj));
}

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0
template <class FUNC, class RET>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(), FUNC>::
invoke(const Function_Rep                            *rep)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f());
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1
template <class FUNC, class RET, class ARGS_01>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11,
                                  ARGS_12), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
          bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11,
                                  ARGS_12,
                                  ARGS_13), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12,
       typename bslmf::ForwardingType<ARGS_13>::Type args_13)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
          bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12),
          bslmf::ForwardingTypeUtil<ARGS_13>::forwardToTarget(args_13)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13


#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0
template <class FUNC, class RET>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(), FUNC>::
invoke(const Function_Rep                            *rep)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f());
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 0

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1
template <class FUNC, class RET, class ARGS_01>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 1

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 2

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 3

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 4

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 5

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 6

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 7

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 8

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 9

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 10

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 11

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11,
                                  ARGS_12), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
          bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 12

#if BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13
template <class FUNC, class RET, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS_01,
                                  ARGS_02,
                                  ARGS_03,
                                  ARGS_04,
                                  ARGS_05,
                                  ARGS_06,
                                  ARGS_07,
                                  ARGS_08,
                                  ARGS_09,
                                  ARGS_10,
                                  ARGS_11,
                                  ARGS_12,
                                  ARGS_13), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS_01>::Type args_01,
       typename bslmf::ForwardingType<ARGS_02>::Type args_02,
       typename bslmf::ForwardingType<ARGS_03>::Type args_03,
       typename bslmf::ForwardingType<ARGS_04>::Type args_04,
       typename bslmf::ForwardingType<ARGS_05>::Type args_05,
       typename bslmf::ForwardingType<ARGS_06>::Type args_06,
       typename bslmf::ForwardingType<ARGS_07>::Type args_07,
       typename bslmf::ForwardingType<ARGS_08>::Type args_08,
       typename bslmf::ForwardingType<ARGS_09>::Type args_09,
       typename bslmf::ForwardingType<ARGS_10>::Type args_10,
       typename bslmf::ForwardingType<ARGS_11>::Type args_11,
       typename bslmf::ForwardingType<ARGS_12>::Type args_12,
       typename bslmf::ForwardingType<ARGS_13>::Type args_13)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS_01>::forwardToTarget(args_01),
          bslmf::ForwardingTypeUtil<ARGS_02>::forwardToTarget(args_02),
          bslmf::ForwardingTypeUtil<ARGS_03>::forwardToTarget(args_03),
          bslmf::ForwardingTypeUtil<ARGS_04>::forwardToTarget(args_04),
          bslmf::ForwardingTypeUtil<ARGS_05>::forwardToTarget(args_05),
          bslmf::ForwardingTypeUtil<ARGS_06>::forwardToTarget(args_06),
          bslmf::ForwardingTypeUtil<ARGS_07>::forwardToTarget(args_07),
          bslmf::ForwardingTypeUtil<ARGS_08>::forwardToTarget(args_08),
          bslmf::ForwardingTypeUtil<ARGS_09>::forwardToTarget(args_09),
          bslmf::ForwardingTypeUtil<ARGS_10>::forwardToTarget(args_10),
          bslmf::ForwardingTypeUtil<ARGS_11>::forwardToTarget(args_11),
          bslmf::ForwardingTypeUtil<ARGS_12>::forwardToTarget(args_12),
          bslmf::ForwardingTypeUtil<ARGS_13>::forwardToTarget(args_13)));
}
#endif  // BSLSTL_FUNCTION_INVOKERUTIL_VARIADIC_LIMIT_C >= 13

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.

template <class FUNC, class RET, class... ARGS>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_FunctionPtr,
                              RET(ARGS...), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS>::Type...  args)
{
    FUNC f = *rep->targetRaw<FUNC, true>();


    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS>::forwardToTarget(args)...));
}

template <class FUNC, class RET, class ARG0, class... ARGS>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS...), FUNC>::
invokeImp(bsl::true_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS>::Type...  args)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f)(
            bslmf::ForwardingTypeUtil<ARGS>::forwardToTarget(args)...));
}

template <class FUNC, class RET, class ARG0, class... ARGS>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS...), FUNC>::
invokeImp(bsl::false_type ,
          FUNC                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj,
          typename bslmf::ForwardingType<ARGS>::Type...  args)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f)(
            bslmf::ForwardingTypeUtil<ARGS>::forwardToTarget(args)...));
}

template <class FUNC, class RET, class ARG0, class... ARGS>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemFunctionPtr,
                              RET(ARG0, ARGS...), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARG0>::Type     obj,
       typename bslmf::ForwardingType<ARGS>::Type...  args)
{
    typedef typename
        bslmf::MemberFunctionPointerTraits<FUNC>::ClassType ClassType;

    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            ClassType *
        >::type IsDirect;

    FUNC f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET,
                                                  invokeImp(IsDirect(), f, obj,
                                                            args...));
}

template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                              RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
invokeImp(bsl::true_type ,
          Func                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, (const_cast<Arg0Ref>(obj).*f));
}

template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
inline
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                              RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
invokeImp(bsl::false_type ,
          Func                                           f,
          typename bslmf::ForwardingType<ARG0>::Type     obj)
{
    typedef typename
        bslmf::MovableRefUtil::RemoveReference<ARG0>::type& Arg0Ref;

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, ((*const_cast<Arg0Ref>(obj)).*f));
}

template <class MEMBER_TYPE, class CLASS_TYPE, class RET, class ARG0>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_MemDataPtr,
                              RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
invoke(const Function_Rep                         *rep,
       typename bslmf::ForwardingType<ARG0>::Type  obj)
{
    typedef typename bsl::is_convertible<
            typename bslmf::MovableRefUtil::RemoveReference<ARG0>::type *,
            const volatile CLASS_TYPE *
        >::type IsDirect;

    Func f = *rep->targetRaw<Func, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET, invokeImp(IsDirect(), f, obj));
}

template <class FUNC, class RET, class... ARGS>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_InplaceFunctor,
                              RET(ARGS...), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS>::Type...  args)
{
    FUNC& f = *rep->targetRaw<FUNC, true>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS>::forwardToTarget(args)...));
}

template <class FUNC, class RET, class... ARGS>
RET
Function_InvokerUtil_Dispatch<Function_InvokerUtil::e_OutofplaceFunctor,
                              RET(ARGS...), FUNC>::
invoke(const Function_Rep                            *rep,
       typename bslmf::ForwardingType<ARGS>::Type...  args)
{
    FUNC& f = *rep->targetRaw<FUNC, false>();

    return BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(
        RET,
        f(bslmf::ForwardingTypeUtil<ARGS>::forwardToTarget(args)...));
}

// }}} END GENERATED CODE
#endif

}  // close package namespace
}  // close enterprise namespace

#else // if ! defined(DEFINED_BSLSTL_FUNCTION_INVOKERUTIL_H)
# error Not valid except when included from bslstl_function_invokerutil.h
#endif // ! defined(COMPILING_BSLSTL_FUNCTION_INVOKERUTIL_H)

#endif // ! defined(INCLUDED_BSLSTL_FUNCTION_INVOKERUTIL_CPP03)

// ----------------------------------------------------------------------------
// Copyright 2021 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 ----------------------------------