结构的成员也是一种类型吗?

Are members of a struct also a type?

下面的代码来自 不知道为什么,这里left和right也是一个类型吗?

// define binary tree structure and traverse helpers:
struct Node {
    int value;
    Node* left;
    Node* right;
    Node(int i=0) : value(i), left(nullptr), right(nullptr) {
}
…
};

    auto left = &Node::left;
    auto right = &Node::right;
    // traverse tree, using fold expression:
    template<typename T, typename… TP>
    Node* traverse (T np, TP… paths) {
    return (np ->* … ->* paths); // np ->* paths1 ->* paths2 …
}

int main()
{
    // init binary tree structure:
    Node* root = new Node{0};
    root->left = new Node{1};
    root->left->right = new Node{2};
    …
    // traverse binary tree:
    Node* node = traverse(root, left, right);
    …
}

可能你问的是 leftright 定义在

auto left = &Node::left;
auto right = &Node::right;

这些不是类型;它们是“成员指针”变量。这里变量 left 表示 struct Node 的成员 left,我们可以采用任何 Node 和指向成员 left 的指针的值并找到成员对象 left,使用专门针对 pointer-to-members.

.*->* 运算符

具体来说,每个都具有“指向 NodeNode* 成员的指针”类型。如果不使用 auto,这两行将是

Node* Node::*left = &Node::left;
Node* Node::*right = &Node::right;

...感谢上帝auto

当这些pointer-to-member变量传递给traverse时,模板参数包TP被推导为两个相同类型Node* (Node::*)。最后,fold 表达式应用 ->* 获取指定成员,依次遍历树。