这个成员指针语法是什么?

Jam*_*son 5 c++

#include <iostream>
#include <type_traits>

struct Foo
{
    // ### Member Function ###
    void bar() { std::cout << "Foo::bar()\n"; }
};

// ### 1 Parameter Primary Template (which is empty) ###
template<typename>
struct Traits {};

// ### 2 Parameter Template Specialization ###
template<class T, class U>
struct Traits<T U::*>
              ^^^^^^ // I don't understand this syntax
{
    using type1 = T;
    using type2 = U;
};

int main()
{
    // ### Pointer to member function ###
    void (Foo::*memFuncPtr)() = &Foo::bar;
    
    Foo f;

    // ### Use the member function pointer to invoke it ###
    (f.*memFuncPtr)();
    
    static_assert(std::is_same_v<void(), Traits<decltype(&Foo::bar)>::type1>);
    static_assert(std::is_same_v<Foo, Traits<decltype(&Foo::bar)>::type2>);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

专业化语法如何工作?Uin与 typeU::*相同是有道理的Foo,但为什么T与 type 相同呢void()?

编辑

在 @user17732522 的非常有用的评论和 @AnoopRana 的回答之后,我能够更改main函数实现以使用相同的语法(只是为了看看它是否有效)。

int main()
{
    using F = void();

    // ### Pointer to member function ###
    F Foo::*memFuncPtr = &Foo::bar;

    Foo f;

    // ### Use the member function pointer to invoke it ###
    (f.*memFuncPtr)();

    static_assert(std::is_same_v<void(), Traits<decltype(&Foo::bar)>::type1>);
    static_assert(std::is_same_v<Foo, Traits<decltype(&Foo::bar)>::type2>);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

use*_*570 8

struct Trait<T U::*>
             ^^^^^^ // I don't understand this syntax
Run Code Online (Sandbox Code Playgroud)

上面的语法意味着我们有一个指向名为的类的成员的指针,U其中该成员的类型为T。换句话说,指向类型为 的类成员的指针UT。

现在让我们将其应用到&Foo::bar. 表达式的类型&Foo::bar为:

void (Foo::* f)()
Run Code Online (Sandbox Code Playgroud)

现在您可以将其与T U::*

所以,经过比较我们得到:

  1. U = Foo这是类类型。
  2. T = void()void这意味着具有返回类型且不带参数的函数,即函数类型。

这实际上意味着我们有一个指向 class 的成员函数的指针,该函数具有返回类型void且不带参数Foo。