2

gcc-4.7.2のソース コードを調べていて、std::function理解std::bindできないメンバー関数ポインターに使用される構文に出くわしました。

私が理解していないのは、次の専門化です_Maybe_wrap_member_pointer

template<typename _Tp, typename _Class>
struct _Maybe_wrap_member_pointer<_Tp _Class::*> // note no comma here
  • _Tpと の間にコンマがないのはなぜ_Class::*ですか?

  • メンバー関数void foo::bar()(以下のサンプル アプリ) を考えると、ここで何を_Tp解決_Class::*するのでしょうか?

以下は、メンバー関数ポインターとオブジェクトをバインドするサンプル アプリです。std::bind(メンバー関数の特殊化/内部に関連するソースコードを引き出しました)

#include <iostream>
#include <functional>

template<typename T>
struct _Maybe_wrap_member_pointer;

template<typename _Tp, typename _Class>
struct _Maybe_wrap_member_pointer<_Tp _Class::*> // <-- I don't understand this
{                                                // why not <_Tp, _Class::*>  
    typedef std::_Mem_fn<_Tp _Class::*> type;    

    static type __do_wrap(_Tp _Class::* __pm)  
    {
        return type(__pm);
    }
};

template<typename _Func, typename... _BoundArgs>
struct _Bind_helper
{
    typedef _Maybe_wrap_member_pointer<typename std::decay<_Func>::type> __maybe_type;

    typedef typename __maybe_type::type __func_type;
    typedef std::_Bind<__func_type(typename std::decay<_BoundArgs>::type...)> type;
};

template<typename _Func, typename... _BoundArgs>
inline 
typename _Bind_helper<_Func, _BoundArgs...>::type
bind(_Func&& __f, _BoundArgs&&... __args)
{
    typedef _Bind_helper<_Func, _BoundArgs...>   __helper_type;
    typedef typename __helper_type::__maybe_type __maybe_type;
    typedef typename __helper_type::type         __result_type;

    return __result_type(__maybe_type::__do_wrap(std::forward<_Func>(__f)),
                                                 std::forward<_BoundArgs>(__args)...);
}

struct foo
{
    void bar()
    {
        std::cout << __func__ << std::endl;
    }
};

int main()
{
    foo f;

    std::function<void()> fun = bind(&foo::bar, f);
    fun();

    exit(0);
}
4

2 に答える 2

1
  • _Tp と _Class::* の間にコンマがないのはなぜですか?

jogojapan がこのパートに回答しました

  • メンバー関数 void foo::bar() (以下のサンプル アプリ) が与えられた場合、_Tp と _Class::* はここで何を解決しますか?

メンバー データへのポインターまたはTp Class::*メンバー関数へのポインターを表すことができるような型は、後者の場合は関数型になります。Tp

あなたの例_Tpでは関数型void ()_Classなり、foo

于 2013-03-06T10:13:25.807 に答える