我正在读一本关于模板的书。有一段示例代码使用折叠表达式使用运算符 ->* 遍历二叉树中的路径:
// 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);
//...
}
Run Code Online (Sandbox Code Playgroud)
我不太明白这条线
auto left = &Node::left;
auto right = &Node::right;
Run Code Online (Sandbox Code Playgroud)
因为我曾经认为 :: 运算符应用于类只会引用它的静态成员,也许在这种情况下我错了,而且我确实知道 :: 是范围解析运算符,它可能会引用 Node 的 left 反正它不是static ,但为什么它可以使用 & 运算符来获取其地址?实际上,我在考虑的是,这只是一个别名吗
using left = &Node::left; // can't compile
Run Code Online (Sandbox Code Playgroud)
只有在
auto left = &Node::left;
Run Code Online (Sandbox Code Playgroud)
auto 的结果是什么?这个表达式的显式类型?
注意:这里使用的是全局的left和right
Node* node = traverse(root, left, right);
Run Code Online (Sandbox Code Playgroud)
这是 main 中的最后一行。
我试过运行它,一切正常,但我不太明白,它是如何工作的?
的类型left和right是
Node* Node::*left
Run Code Online (Sandbox Code Playgroud)
指向类数据成员的指针的情况。您可以想象它对的未指定实例left 的表示内的偏移量进行编码Node,而不是内存中的固定位置。它只能在提供此实例时取消引用,
node.*left
Run Code Online (Sandbox Code Playgroud)
(给出一个Node*)或者在你的情况下,根是一个(普通)指针本身,
root->*left.
Run Code Online (Sandbox Code Playgroud)
这是什么线
return (np ->* ... ->* paths);
Run Code Online (Sandbox Code Playgroud)
展开到。
| 归档时间: |
|
| 查看次数: |
300 次 |
| 最近记录: |