在 C++ 中将多个 class 函数指针作为函数参数传递
pass multiple class function pointer as function parameter in c++
I am newly learning function pointer and able to pass function pointer between classes.
Now i am looking to receive function pointer parameter of all the other classes.
fncptr2.h
#ifndef FNCPTR2
#define FNCPTR2
class fncptr1;
class fncptr2
{
public:
int implfncptr(int (fncptr1::*add)(int,int));
};
#endif
fncptr2.cpp
#include "fncptr2.h"
#include "fncptr1.h"
#include <iostream>
using namespace std;
fncptr1 ff;
int fncptr2::implfncptr(int (fncptr1::*add)(int, int))
{
return (ff.*add)(1,2);
}
fncptr1.h
#ifndef FNCPTR1
#define FNCPTR1
class fncptr1
{
public:
int addition(int a,int b);
void testfncptr();
};
#endif
fncptr1.cpp
#include "fncptr1.h"
#include "fncptr2.h"
#include <iostream>
using namespace std;
int fncptr1::addition(int a,int b)
{
return a + b;
}
void fncptr1::testfncptr()
{
fncptr2 f;
f.implfncptr(&fncptr1::addition);
}
main.cpp
fncptr1 f;
f.testfncptr();
The above sample code works fine. Now looking to receive all the function pointers in
int implfncptr(int (fncptr1::*add)(int,int));
Instead of receive fncptr1 function pointer , looking to receive the function pointers from all the other classes
Example
int implfncptr(int (AllClassInstance::*add)(int,int));
好的,你的问题不太合理,但听起来你想要的是一个更通用的解决方案。首先,我没有像您那样使用函数指针。这是非常 C 风格的,还有更好的方法。我对“更好”的定义是“适合更多解决方案”。我喜欢的方式可能会对性能造成非常轻微的影响。
#include <functional>
class Foo {
public:
typedef std::function<bool(std::string &)> MyFunct;
void someMethod(MyFunct funct) {
std::string str = "Foo";
if (funct(str)) {
...
}
}
};
// Then somewhere else, you can do this:
bool f(const std::string &str) {
return str.length() > 10;
}
Foo foo;
foo.someMethod(f);
但我喜欢这个的原因是你也可以使用 lambdas:
Foo foo;
foo.someMethod([](const std::string &str) { return str.length() > 10; });
或者您可以像这样预定义 lambda:
Foo::MyFunct f = [](const std::string &str) { return str.length() > 10; };
foo.someMethod(f);
我不知道这是否真的能帮助你推进你想做的事情,因为在我写这个答案时你的问题还不是很清楚。但这可能有助于提供一些其他方法来完成您想要的。
我确信有人支持 C 风格的函数指针,但在我看来,函数式接口提供了更好的特性。
I am newly learning function pointer and able to pass function pointer between classes. Now i am looking to receive function pointer parameter of all the other classes.
fncptr2.h
#ifndef FNCPTR2
#define FNCPTR2
class fncptr1;
class fncptr2
{
public:
int implfncptr(int (fncptr1::*add)(int,int));
};
#endif
fncptr2.cpp
#include "fncptr2.h"
#include "fncptr1.h"
#include <iostream>
using namespace std;
fncptr1 ff;
int fncptr2::implfncptr(int (fncptr1::*add)(int, int))
{
return (ff.*add)(1,2);
}
fncptr1.h
#ifndef FNCPTR1
#define FNCPTR1
class fncptr1
{
public:
int addition(int a,int b);
void testfncptr();
};
#endif
fncptr1.cpp
#include "fncptr1.h"
#include "fncptr2.h"
#include <iostream>
using namespace std;
int fncptr1::addition(int a,int b)
{
return a + b;
}
void fncptr1::testfncptr()
{
fncptr2 f;
f.implfncptr(&fncptr1::addition);
}
main.cpp
fncptr1 f;
f.testfncptr();
The above sample code works fine. Now looking to receive all the function pointers in
int implfncptr(int (fncptr1::*add)(int,int));
Instead of receive fncptr1 function pointer , looking to receive the function pointers from all the other classes
Example
int implfncptr(int (AllClassInstance::*add)(int,int));
好的,你的问题不太合理,但听起来你想要的是一个更通用的解决方案。首先,我没有像您那样使用函数指针。这是非常 C 风格的,还有更好的方法。我对“更好”的定义是“适合更多解决方案”。我喜欢的方式可能会对性能造成非常轻微的影响。
#include <functional>
class Foo {
public:
typedef std::function<bool(std::string &)> MyFunct;
void someMethod(MyFunct funct) {
std::string str = "Foo";
if (funct(str)) {
...
}
}
};
// Then somewhere else, you can do this:
bool f(const std::string &str) {
return str.length() > 10;
}
Foo foo;
foo.someMethod(f);
但我喜欢这个的原因是你也可以使用 lambdas:
Foo foo;
foo.someMethod([](const std::string &str) { return str.length() > 10; });
或者您可以像这样预定义 lambda:
Foo::MyFunct f = [](const std::string &str) { return str.length() > 10; };
foo.someMethod(f);
我不知道这是否真的能帮助你推进你想做的事情,因为在我写这个答案时你的问题还不是很清楚。但这可能有助于提供一些其他方法来完成您想要的。
我确信有人支持 C 风格的函数指针,但在我看来,函数式接口提供了更好的特性。