【问题标题】:std::function and friend functionstd::function 和友元函数
【发布时间】:2019-04-20 14:32:21
【问题描述】:

在这个例子中,我有一个函数指针 (std::function) 作为我的类的一个属性。所以我可以将任何形式为 void myFunction(void) 的函数关联到我的类。

#include <iostream>
#include <functional>

class Example{
private:
    int variable=4;
public:
    std::function<void(void)> myNonMemberFunction;
    Example(void){
    }
    Example(std::function<void(void)> MyNonMemberFunction){
        myNonMemberFunction=MyNonMemberFunction;
    }
};

void PrintPlop(){
    std::cout<<"plop"<<std::endl;
}

int main() {
    Example example(PrintPlop);
    example.myNonMemberFunction();
}

现在,我想做同样的事情,但使用一个访问类属性的函数,如友元函数或类成员函数。我该怎么做?

【问题讨论】:

  • 无关:你没有指针(这是件好事)

标签: c++11 friend std-function


【解决方案1】:

所以你想让你传递给构造函数的任何函数成为朋友吗?

严格意义上来说是不可能的,因为访问级别(友元与否)是编译时的问题,而将哪个值传递给构造函数,一般来说只有在运行时才确定。

因此,您要么将所有相关函数声明为友元(在这种情况下为什么不将它们设为方法?),要么将私有成员作为附加参数传递给它们。像这样:

class Example{
private:
    int variable=4;
    std::function<void(int)> myNonMemberFunction;
public:
    Example(void){
    }
    Example(std::function<void(int)> MyNonMemberFunction){
        myNonMemberFunction=MyNonMemberFunction;
    }
    void callMyNonMemberFunction() {
      myNonMemberFunction(variable);
    }
};

void PrintPlop(int v){
    std::cout<<"plop"<< v << std::endl;
}

int main() {
    Example example(PrintPlop);
    example.callMyNonMemberFunction();
}

【讨论】:

  • 谢谢,它解决了我的问题。我这样做了,因为我想自定义操作类的不同属性的方式。为此,我已将 std::function 修改为 std::function 并且它可以工作。
  • @BaptisteNguyen,很高兴知道!请注意,这里的“谢谢”是通过点赞来表达的(请参阅我的答案左上角的三角形?点击它!)并将答案标记为正确的。
猜你喜欢
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多