结构的成员也是一种类型吗?
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);
…
}
可能你问的是 left
和 right
定义在
auto left = &Node::left;
auto right = &Node::right;
这些不是类型;它们是“成员指针”变量。这里变量 left
表示 struct Node
的成员 left
,我们可以采用任何 Node
和指向成员 left
的指针的值并找到成员对象 left
,使用专门针对 pointer-to-members.
的 .*
或 ->*
运算符
具体来说,每个都具有“指向 Node
的 Node*
成员的指针”类型。如果不使用 auto
,这两行将是
Node* Node::*left = &Node::left;
Node* Node::*right = &Node::right;
...感谢上帝auto
。
当这些pointer-to-member变量传递给traverse
时,模板参数包TP
被推导为两个相同类型Node* (Node::*)
。最后,fold 表达式应用 ->*
获取指定成员,依次遍历树。
下面的代码来自
// 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);
…
}
可能你问的是 left
和 right
定义在
auto left = &Node::left;
auto right = &Node::right;
这些不是类型;它们是“成员指针”变量。这里变量 left
表示 struct Node
的成员 left
,我们可以采用任何 Node
和指向成员 left
的指针的值并找到成员对象 left
,使用专门针对 pointer-to-members.
.*
或 ->*
运算符
具体来说,每个都具有“指向 Node
的 Node*
成员的指针”类型。如果不使用 auto
,这两行将是
Node* Node::*left = &Node::left;
Node* Node::*right = &Node::right;
...感谢上帝auto
。
当这些pointer-to-member变量传递给traverse
时,模板参数包TP
被推导为两个相同类型Node* (Node::*)
。最后,fold 表达式应用 ->*
获取指定成员,依次遍历树。