diff options
Diffstat (limited to 'libcxx/include')
| -rw-r--r-- | libcxx/include/type_traits | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index 35777c8e183..653809cb93e 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -1321,6 +1321,71 @@ public: typedef decltype(declval<_Fn>()(declval<_ArgTypes>()...)) type; }; +#if 0 + +template <class _MP, class _Tp, class ..._Args> +struct __result_of_mp; + +// member function pointer + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...), _Tp, _Args...> +{ + typedef _R type; +}; + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...) const, _Tp, _Args...> +{ + typedef _R type; +}; + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...) volatile, _Tp, _Args...> +{ + typedef _R type; +}; + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...) const volatile, _Tp, _Args...> +{ + typedef _R type; +}; + +// member data pointer + +template <class _MP, class _Tp, bool> +struct __result_of_mdp; + +template <class _R, class _Class, class _Tp> +struct __result_of_mdp<_R _Class::*, _Tp, false> +{ + typedef typename __apply_cv<decltype(*_STD::declval<_Tp>()), _R>::type type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mdp<_R _Class::*, _Tp, true> +{ + typedef typename __apply_cv<_Tp, _R>::type&& type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mp<_R _Class::*, _Tp> + : public __result_of_mdp<_R _Class::*, _Tp, + is_base_of<_Class, typename remove_reference<_Tp>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class ..._ArgTypes> +class __result_of<_Fn(_Tp, _ArgTypes...), false> // _Fn must be member pointer + : public __result_of_mp<_Fn, _Tp, _ArgTypes...> +{ +}; + +#endif + +// result_of + template <class _Fn, class ..._ArgTypes> class result_of<_Fn(_ArgTypes...)> : public __result_of<_Fn(_ArgTypes...), |

