C++ 11/14:如何从类型中删除指向成员的指针?

And*_*zos 9 c++ c++11 c++14

在C++ 11或C++ 1y/14中:给定表单的指向成员类型的值T C::*我希望得到指向类型的T.

例如:

#include <iostream>
using namespace std;

struct T1 { static void f() { cout << "T1" << endl; } };
struct T2 { static void f() { cout << "T2" << endl; } };

struct U1 { T1 x; };
struct U2 { T2 x; };

template<class C> struct V;
template<> struct V<U1> { static constexpr T1 U1::* pm = &U1::x; };
template<> struct V<U2> { static constexpr T2 U2::* pm = &U2::x; };

template<class W>
void f(W pm)
{
     typedef ??? T;
     T::f();
}

int main()
{
        f(V<U1>::pm);
        f(V<U2>::pm);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?什么在云???上面?

更新:

这是libstdc ++实现的清理版本std::remove_pointer:

template<typename T, typename>
struct remove_pointer_helper
{ 
    typedef T type; 
};

template<typename T, typename U>
struct remove_pointer_helper<T, U*>
{ 
    typedef U type; 
};

template<typename T>
struct remove_pointer
    : public remove_pointer_helper<T, typename remove_cv<T>::type>
{};
Run Code Online (Sandbox Code Playgroud)

更新2:

这是最终的解决方案,谢谢:

#include <iostream>
using namespace std;

template<typename T, typename>
struct remove_member_pointer_helper
{
    typedef T type;
};

template<typename T, typename U, typename C>
struct remove_member_pointer_helper<T, U C::*>
{
    typedef U type;
};

template<typename T>
struct remove_member_pointer
    : public remove_member_pointer_helper<T, typename remove_cv<T>::type>
{};

template<typename T>
using remove_member_pointer_t = typename remove_member_pointer<T>::type;

struct T1 { static void f() { cout << "T1" << endl; } };
struct T2 { static void f() { cout << "T2" << endl; } };

struct U1 { T1 x; };
struct U2 { T2 x; };

template<class C>
struct V;

template<> struct V<U1> { static constexpr T1 U1::* pm = &U1::x; };
template<> struct V<U2> { static constexpr T2 U2::* pm = &U2::x; };

template<class W>
void f(W pm)
{
        remove_member_pointer_t<W>::f();
}

int main()
{
        f(V<U1>::pm);
        f(V<U2>::pm);
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 9

这实际上是模板专业化的一个简单练习:

template<class T> struct remove_member_pointer {
    typedef T type;
};
template<class C, class T> struct remove_member_pointer<T C::*> {
    typedef T type;
};
Run Code Online (Sandbox Code Playgroud)

  • 你可以提到`template <typename t>使用remove_member_pointer_t = typename remove_member_pointer <t> :: type;`否则这只是"C++ 03". (3认同)