template<typename F>
struct member_of
{
private:
//template <class T, typename R, typename... Args> static typename T* __fn_to_cx(R(T::*)(Args...));
template <class T, typename R> static typename T __fn_to_cx(R(T::*)());
template <class T, typename R, typename A1> static typename T __fn_to_cx(R(T::*)(A1));
template <class T, typename R, typename A1, typename A2> static typename T __fn_to_cx(R(T::*)(A1,A2));
template <class T, typename R, typename A1, typename A2, typename A3> static typename T __fn_to_cx(R(T::*)(A1,A2,A3));
template <class T, typename R, typename A1, typename A2, typename A3, typename A4> static typename T __fn_to_cx(R(T::*)(A1,A2,A3,A4));
template <class T, typename R, typename A1, typename A2, typename A3, typename A4, typename A5> static typename T __fn_to_cx(R(T::*)(A1,A2,A3,A4,A5));
public:
typedef typename decltype(__fn_to_cx(F())) type;
};
Usage: member_of<&SomeClass::SomeMember>::type will always be of type SomeClass.
That is all.