std::function
및 std::bind
의 소스 코드를 gcc-4.7.2에서보고 있는데, 이해가되지 않는 멤버 함수 포인터에 사용되는 구문이 있습니다.이상한 템플릿 구문 <functional>
template<typename _Tp, typename _Class>
struct _Maybe_wrap_member_pointer<_Tp _Class::*> // note no comma here
왜
_Tp
와_Class::*
사이에 쉼표가 없습니다 :내가 이해하지 못하는 것은
_Maybe_wrap_member_pointer
의 전문성은?void foo::bar()
(내 샘플 앱에서)_Tp
과_Class::*
은 무엇을 여기에서 해결할 것입니까?
다음은 멤버 함수 포인터와 개체를 바인딩하는 샘플 응용 프로그램입니다. 이것은 참으로 템플릿 매개 변수로 멤버 포인터 타입을 지정하는 데 사용되는 구문입니다
#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);
}
은 그러므로 우리는 여전히()') (AN'연산자 데이터 멤버 유형은'_Tp' 클래스 될 수 있음을 추가 정의 할 수있을 것이다 (함수가 아닐지라도) 호출 가능해야한다. 'bind'와'function'은 그것을 돌 봅니다. –
'_Tp'도 함수 타입이 될 수 있습니다.'Tp Class :: *'구조체는 멤버 데이터에 대한 포인터를 참조 할 수 있습니다. _or_ 멤버 함수 포인터 –