c++ - std::function 作为类的友元

标签 c++ c++11 lambda friend std-function

考虑这段代码:

#include <functional>

class A{
public:
    std::function<void(A* obj)> todo;
    void doWork(){
        if(todo)
            todo(this);
    }

private:
    void dummy(){}
    friend void todo(); // not working
};

int main(int argc, char *argv[])
{
    A tmp;
    tmp.todo = [](A *obj){
        obj->dummy();
    };
    tmp.doWork();

    return 0;
}

当然,我们无法构建此代码,因为 'A::dummy': 无法访问类 'A' 中声明的私有(private)成员。 我认为这是不可能的,但是有没有办法从 lambda 声明访问 A 类的私有(private)成员??

最佳答案

friend void todo(); // not working

是的,它不起作用。这声明友元函数是某个名为“todo”的函数。

这与同名类成员不同。友元是函数(或类),而不是类成员。

您在这里面临的基本问题是两个基本 C++ 方面的组合:

  1. std::function<something>是一个具体的、独立的类。

  2. 每个 lambda 都是一个匿名类,所有 lambda 都是离散的、不同的匿名类。

你可以这样声明:

friend class std::function<void(A* obj)>;

但这不会取得任何成果。这将允许 std::function模板本身来访问此类的私有(private)成员。因此,如果您的 C++ 库的 std::function 的内部实现中存在某些内容模板需要访问一个私有(private)类成员,它现在可以做到这一点。但是,当然,std::function 中什么也没有。本身对您的类(class)有任何了解。

并且由于每个 lambda 本身都是一个离散的匿名类,这对任何 lambda 都没有影响。 std::function对于这些匿名 lambda,它本身是它自己的一个具体类,它影响类型删除。

简而言之,这在C++中是做不到的。您真正想要的是将特定的匿名 lambda 类设为 friend这个类的。但是C++中没有这样的语法。您必须想出一些其他替代策略,让您的 lambda 可以访问您类(class)的私有(private)成员。

关于c++ - std::function 作为类的友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63873049/

相关文章:

c++ - STL 列表实现

Angular 2 : Cannot find name 'Params'

c++ - 如何编写一个灵活的模块化程序,模块之间具有良好的交互可能性?

c++ - Boost精神太贪心

c++ - 使 CTime 和 CTimeSpan 忽略夏令时

python - 用 cython 包装 c++ 和 CUDA 代码

c++ - 返回 char*/Visual Studio 调试器异常

c++ - 如何减少大量包装类的实现代码?

vb.net - 将 Sub 包装为函数以便在 Lambda 中使用

python - 以 elif 方式比较 Pandas 数据框中的字符串