从成员函数指针类型中删除类指针

时间:2019-06-21 19:36:41

标签: c++ c++11 templates

我在std :: is_function的cppreference的示例中看到了此代码片段,但我不知道它是如何工作的。有人可以向我解释为什么U像在PM_traits中那样被推导吗?

struct A {
  int fun() const&;
};

template<typename>
struct PM_traits {}; 

template<class T, class U>
struct PM_traits<U T::*> {
  using member_type = U;
};

int main() {
  using T = PM_traits<decltype(&A::fun)>::member_type; // T is int() const&
}

1 个答案:

答案 0 :(得分:11)

U T::*是这样的类型,当我们有U T::* p时,p指向类T的成员,而该成员的类型为U

fun是类型int () const &的函数:一个const &限定的函数,不带参数,返回int,并且是类A的成员。因此,在推论中,将T推导为A,将U推导为A::fun的类型,即int () const &


这可能看起来有些混乱,因为如果&A::fun的类型被明确拼写,则必须将其写成int (A::*)() const &。但是,在模板的情况下,类型int () const &被隐藏在名称U的后面,因此指向成员的指针就是U A::*。类似于如何使用类型名称来简化普通函数指针的语法:

int foo(char, double) { return 42; }

using Fun = int (char, double);
Fun *p = &foo;
// instead of:
int (*q)(char, double) = &foo;

模板中也是如此,只是使用A::*而不是*