《C++ templates》4.2节讲解C++17
折叠表达式的时候,有如下一段代码:
#include <iostream>
struct Node {
int value;
Node *left;
Node *right;
Node (int i = 100) : value(i), left(nullptr), right(nullptr) {}
};
auto left = &Node::left;
auto right = &Node::right;
template <typename T, typename... TP>
Node *traverse(T np, TP... paths)
{
return (np ->* ... ->* paths);
}
int main()
{
std::cout << left << std::endl; // 打印1
std::cout << right << std::endl; // 打印1
Node *root = new Node(0);
root->left = new Node(1);
root->right = new Node(2);
root->left->left = new Node(3);
root->left->right = new Node(4);
root->right->left = new Node(5);
root->right->right = new Node(666);
Node *node = traverse(root, left, right);
std::cout << node->value << std::endl; // 打印4
return 0;
}
疑问如下:
(1)
left
和right
到底是个什么变量,为啥值会是1
?它们和root
变量有什么相同点和不同点?
(2)
对root
和left
、right
执行->*
返回的是啥?是不是同时执行了operator->
和operator*
?为啥traverse
最终返回的是指向4
的节点的指针?
求大神们解惑,小弟感激不尽!!!