std::function 和友元函数
std::function and friend function
在这个例子中,我有一个函数指针 (std::function) 作为我 class 的属性。所以我可以将 void myFunction(void) 形式的任何函数关联到我的 class.
#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();
}
现在,我想做同样的事情,但是使用一个可以访问 class 属性的函数,例如友元函数或 class 成员函数。我该怎么做?
所以你想让你传递给构造函数的任何函数成为朋友?
严格意义上是不可能的,因为访问级别(friend or not)是编译时的问题,传递给构造函数的值一般来说只在运行中确定-时间。
因此,您要么将所有相关函数声明为友元(在这种情况下为什么不直接将它们设为方法?),要么将私有成员作为附加参数传递给它们。像这样:
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) 作为我 class 的属性。所以我可以将 void myFunction(void) 形式的任何函数关联到我的 class.
#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();
}
现在,我想做同样的事情,但是使用一个可以访问 class 属性的函数,例如友元函数或 class 成员函数。我该怎么做?
所以你想让你传递给构造函数的任何函数成为朋友?
严格意义上是不可能的,因为访问级别(friend or not)是编译时的问题,传递给构造函数的值一般来说只在运行中确定-时间。
因此,您要么将所有相关函数声明为友元(在这种情况下为什么不直接将它们设为方法?),要么将私有成员作为附加参数传递给它们。像这样:
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();
}