|
@@ -1321,6 +1321,71 @@ public:
|
|
typedef decltype(declval<_Fn>()(declval<_ArgTypes>()...)) type;
|
|
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>
|
|
template <class _Fn, class ..._ArgTypes>
|
|
class result_of<_Fn(_ArgTypes...)>
|
|
class result_of<_Fn(_ArgTypes...)>
|
|
: public __result_of<_Fn(_ArgTypes...),
|
|
: public __result_of<_Fn(_ArgTypes...),
|