std::function<void(int)> 在此代码中究竟做了什么?

What exactly is std::function<void(int)> doing in this code?

最近看到一些二叉搜索树中序遍历的代码如下:

void binary_search_tree::inorder_traversal(bst_node *node, std::function<void(int)> callback) {

    if (node == nullptr) {
        return;
    }

    inorder_traversal(node->left, callback);
    callback(node->value);
    inorder_traversal(node->right, callback);
}

std::vector<int> binary_search_tree::get_elements_inorder() {
    std::vector<int> elements;

    inorder_traversal(root, [&](int node_value) {
        elements.push_back(node_value);
    });

    return elements;
}

根据我的理解,第一个函数按顺序递归遍历BST,访问左侧,然后是节点,然后是右侧。然后第二个函数调用此函数以在命中每个节点时将每个元素添加到向量中。

我的困惑来自节点的每个值是如何获取的。 callback(node->value) 是否将每个节点值存储在某处以备后用?我不太确定这是如何工作的。

任何帮助将不胜感激:) 谢谢!

https://en.cppreference.com/w/cpp/utility/functional/function 有一个很好的描述:

Class template std::function is a general-purpose polymorphic function wrapper. Instances of std::function can store, copy, and invoke any CopyConstructible Callable target -- functions, lambda expressions, bind expressions, or other function objects, as well as pointers to member functions and pointers to data members.

std::function<void(int)> 存储一个可以用 int 参数调用的函数(或类似函数),而 returns 什么都没有。特别是您可以在其中存储一个 lambda。

此处 inorder_traversal 函数以 lambda [&](int node_value) { elements.push_back(node_value); } 作为参数调用(在名称 callback 下)。

然后当 inorder_traversal 调用 callback(node->value); 时,它实际上调用了代码 elements.push_back(node->value)。不完全是,因为这只有效,因为 lambda 已被捕获 captured elements - 否则向量将无法在此处访问。但是要了解更多关于它是如何工作的,我建议你阅读 lambdas - 这有点超出了这个问题的范围。