如何制作容器元素只能调用容器一个私有函数的结构

How to make structure where container's element can call containers only one private function

我想创建结构,其中 容器元素 可以向 容器 提供 回调,但是我不想让它成为 public。我应该怎么做?我不能保证,也许我需要静态地给容器的 私有函数 地址给元素或以某种方式使用 friend?顺便说一句 element 应该 "see" 其他容器的私有函数。

例如class Cont 存储 class ElemCont 私有函数 void callback();Elem知道自己在哪个Cont,可以调用回调函数Cont 之外的任何人都不能使用 回调函数

Elem 构造函数中,您可以为回调提供一个参数(使用例如 std::function 或类似的方法),并让 Elem class 存储它。然后当回调需要调用的时候,直接调用即可。

您还可以在 Elem 中创建一个 "setter" 函数来设置回调。


完整示例

#include <iostream>
#include <string>
#include <functional>
#include <vector>

class Elem
{
private:
    int value_;
    std::function<void(const std::string&)> callback_;

public:
    Elem(int v, std::function<void(const std::string&)> cb)
        : value_{v}, callback_{cb}
    {}

    void some_function() const
    {
        callback_("Elem with value " + std::to_string(value_));
    }
};

class Cont
{
private:
    std::vector<Elem> elements_;

    void private_function(const std::string& s)
    {
        std::cout << "In private function: " << s << '\n';
    }

public:
    void add_value(const int v)
    {
        elements_.push_back(Elem(v, std::bind(&Cont::private_function, this, std::placeholders::_1)));
    }

    std::vector<Elem>::const_iterator begin() const
    {
        return std::begin(elements_);
    }

    std::vector<Elem>::const_iterator end() const
    {
        return std::end(elements_);
    }
};

int main()
{
    Cont c;

    // Add some elements
    for (int i = 1; i <= 10; ++i)
        c.add_value(i);

    // Call callback function
    for (const auto& e : c)
        e.some_function();
}

输出:

In private function: Elem with value 1
In private function: Elem with value 2
In private function: Elem with value 3
In private function: Elem with value 4
In private function: Elem with value 5
In private function: Elem with value 6
In private function: Elem with value 7
In private function: Elem with value 8
In private function: Elem with value 9
In private function: Elem with value 10

See it in action.

在上面的代码中,私有函数Cont::private_functionElemclass是完全未知的,不能直接调用。但是,我们可以使用参数将它传递给 Elem class,然后从 Elem class 内部调用它而根本不公开私有函数。