将类成员函数作为参数传递给全局函数
Passing a class-member function to a global function as argument
我试图将类a的成员函数传递给全局函数作为参数。我该怎么做才能让它成功呢?还有,这是个好主意吗?上下文:我想这样做是因为(同义词)doSomething(...)
是一个非常通用的函数,在main()
以及不同的类中使用。因此,我可以避免在我的项目中有几个相同代码的副本。有什么替代方案(如果不是最优的)?
#include <iostream>
using namespace std;
double doSomething(int i, double (*f)(double)) { return (*f)(i); }
class A{
public:
A(double x) : number(x) {}
double times(double i) { return ::doSomething(i, &A::multiply);} //calles the global function and gives a member function as parameter
double multiply(double i) {return number*i;}
private:
double number;
};
int main() {
A obj(5.0);
cout << obj.times(3.5) <<endl;
return 0;
}
编译器抱怨:
../src/test5.cpp: In member function ‘double A::times(double)’:
../src/test5.cpp:17:63: error: cannot convert ‘double (A::*)(double)’ to ‘double (*)(double)’ for argument ‘2’ to ‘double doSomething(int, double (*)(double))’
double times(double i) { return ::doSomething(i, &A::multiply);} //calles the global function and gives a parameter member function as parameter
^
../src/test5.cpp:17:65: warning: control reaches end of non-void function [-Wreturn-type]
double times(double i) { return ::doSomething(i, &A::multiply);} //calles the global function and gives a parameter member function as parameter
你的doSomething
函数需要一个自由函数指针(自由函数意味着非成员函数)。你尝试传递一个成员函数指针给它。这行不通。为什么?当您有一个自由函数时,比如void f(double)
,您可以简单地调用它:
f(3.14);
另一方面,当你有一个成员(非静态)函数时,调用它需要一个对象,例如:
obj.m(3.14);
,没有对象就不能调用成员函数。因此,成员函数不能与自由函数互换使用,因为调用它们的方式不同。想想doSomething
函数中的(*f)(i)
调用——multiply
调用的A
对象是什么?
你的设计需要重新思考。如果您想共享代码,也许您需要一些类层次结构和基类中的公共代码?
对于c++ 11,您可以这样做:
#include <functional>
typedef std::function<double (double)> do_something_function;
double doSomething(double i, do_something_function f) { return f(i); }
class A{
public:
A(double x) : number(x) {}
double times(double i) {
do_something_function f = [this] (double i) {
return this->multiply(i);
};
return ::doSomething(i, f);
}
double multiply(double i) {
return number * i;
}
private:
double number;
};
通过指针调用类的non-static
函数成员的方式与在独立函数中调用的方式不同,因为需要一个指向实例的指针。
#include <iostream>
using namespace std;
class A;
typedef double (A::*f)(double);
double doSomething(double i, f p, A* ap);
class A {
public:
A(double x) : number(x) {
}
double times(double i) {
return ::doSomething(i, &A::multiply, this);
} //calles the global function and gives a member function and pointer to A
double multiply(double i) {
return number*i;
}
private:
double number;
};
double doSomething(double i, double (A::*fp)(double), A* ap) {
return (ap->*fp)(i); // call *fp on *ap
}
int main() {
A obj(5.0);
cout << obj.times(3.5) << endl;
return 0;
}
示例
将非静态成员函数转换为全局函数是一种编程技巧参考源代码:https://github.com/shenxiaolong-code/processInternalExplorer/blob/master/sources/SystemExplorer/include/SystemExplorer/callback_cpp2c.h
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 为什么我不能将引用作为 std::async 的函数参数传递
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何通过 C++ 中的函数参数传递初始值设定项列表的固定大小的初始值设定项列表?
- 我可以动态创建新地图并作为函数参数传递吗?
- 将任意模板向量作为函数参数C++传递
- 将函数指针作为函数参数传递的目的
- C++:通过函数参数传递的值给出不同的结果
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 通过宏将函数参数传递给函数
- C++:访问作为函数参数传递的双指针数组所指向的变量的值
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将派生类构造函数参数传递给受保护的成员
- 将指向数组的指针作为函数参数传递,这本身就是另一个函数的返回值?
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何将变量作为构造函数参数或函数参数传递
- 当数组对象以函数参数传递时,为什么复制构造函数会自称