⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 delegate_mfn_cc_impl.hpp

📁 An article on the implementation of a fast C++ delegate with many advanced features.
💻 HPP
字号:
// FD.Delegate
// Do not include this header directly.

  /**
   * mfn_bind() for member function bind with calling convention.
   */
  template<typename UR FD_DELEGATE_COMMA FD_DELEGATE_TEMPLATE_PARMS2, typename U, typename T>
  self_type & FD_DELEGATE_CC_NAME(mfn_bind)(UR (FD_DELEGATE_MF_CC U::*fxn)(FD_DELEGATE_TEMPLATE_ARGS2), T t, bool reset = true)
  {
    typedef struct
    {
      typedef UR (FD_DELEGATE_MF_CC U::*TFxn)(FD_DELEGATE_TEMPLATE_ARGS2);

      typedef
        FD_DELEGATE_MFN_BIND_ON_PTR<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA typename boost::remove_pointer<T>::type, TFxn>
        ptr_type;

      typedef
        FD_DELEGATE_MFN_BIND_ON_REF<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA T, TFxn>
        ref_type;

      typedef
        FD_DELEGATE_MFN_BIND_ON_OBJ<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA T, TFxn, Allocator>
        obj_type;

      typedef typename boost::ct_if
        <
          ::boost::is_pointer<T>::value,
          ptr_type,
          boost::ct_if< ::boost::is_reference_wrapper<T>::value, ref_type, obj_type>
        >::type type_1;

      typedef typename type_1::type type;
    } select_stub;

    if( reset ) this->clear();
    select_stub::type::init( this->get_holder(), t, fxn );
    return *this;
  }

  /**
   * mfn_bind_const() for member function bind with calling convention.
   */
  template<typename UR FD_DELEGATE_COMMA FD_DELEGATE_TEMPLATE_PARMS2, typename U, typename T>
  self_type & FD_DELEGATE_CC_NAME(mfn_bind_const)(UR (FD_DELEGATE_MF_CC U::*fxn)(FD_DELEGATE_TEMPLATE_ARGS2) const, T t, bool reset = true)
  {
    typedef struct
    {
      typedef UR (FD_DELEGATE_MF_CC U::*TFxn)(FD_DELEGATE_TEMPLATE_ARGS2) const;

      typedef
        FD_DELEGATE_MFN_BIND_ON_PTR<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA typename boost::remove_pointer<T>::type, TFxn>
        ptr_type;

      typedef
        FD_DELEGATE_MFN_BIND_ON_REF<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA T, TFxn>
        ref_type;

      typedef
        FD_DELEGATE_MFN_BIND_ON_OBJ<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA T, TFxn, Allocator>
        obj_type;

      typedef typename boost::ct_if
        <
          ::boost::is_pointer<T>::value,
          ptr_type,
          boost::ct_if< ::boost::is_reference_wrapper<T>::value, ref_type, obj_type>
        >::type type_1;

      typedef typename type_1::type type;
    } select_stub;

    if( reset ) this->clear();
    select_stub::type::init( this->get_holder(), t, fxn );
    return *this;
  }

#if FD_DELEGATE_NUM_ARGS > 0

  /**
   * mfn() for member function bind with calling convention.
   */
  template<typename UR FD_DELEGATE_COMMA_SP FD_DELEGATE_TEMPLATE_PARMS2_SP, typename U>
  self_type & FD_DELEGATE_CC_NAME(mfn)(UR (FD_DELEGATE_MF_CC U::*fxn)(FD_DELEGATE_TEMPLATE_ARGS2_SP), bool reset = true)
  {
    typedef struct
    {
      typedef UR (FD_DELEGATE_MF_CC U::*TFxn)(FD_DELEGATE_TEMPLATE_ARGS2_SP);

      typedef
        FD_DELEGATE_MFN_ON_PTR<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA TFxn>
        ptr_type;

      typedef
        FD_DELEGATE_MFN_ON_OBJ<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA TFxn>
        obj_type;

      typedef typename boost::ct_if
        <
          ::fd::detail::delegate::is_<T0>::template pointer_of_<U>::value, ptr_type, obj_type
        >::type type;
    } select_stub;

    if( reset ) this->clear();
    select_stub::type::init( this->get_holder(), fxn );
    return *this;
  }

  /**
   * mfn_const() for member function bind with calling convention.
   */
  template<typename UR FD_DELEGATE_COMMA_SP FD_DELEGATE_TEMPLATE_PARMS2_SP, typename U>
  self_type & FD_DELEGATE_CC_NAME(mfn_const)(UR (FD_DELEGATE_MF_CC U::*fxn)(FD_DELEGATE_TEMPLATE_ARGS2_SP) const, bool reset = true)
  {
    typedef struct
    {
      typedef UR (FD_DELEGATE_MF_CC U::*TFxn)(FD_DELEGATE_TEMPLATE_ARGS2_SP) const;

      typedef
        FD_DELEGATE_MFN_ON_PTR<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA TFxn>
        ptr_type;

      typedef
        FD_DELEGATE_MFN_ON_OBJ<result_type, FD_DELEGATE_TEMPLATE_ARGS FD_DELEGATE_COMMA TFxn>
        obj_type;

      typedef typename boost::ct_if
        <
          ::fd::detail::delegate::is_<T0>::template pointer_of_<U>::value, ptr_type, obj_type
        >::type type;
    } select_stub;

    if( reset ) this->clear();
    select_stub::type::init( this->get_holder(), fxn );
    return *this;
  }

#endif // #if FD_DELEGATE_NUM_ARGS > 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -