OO方式将函数传递给类
OO way to pass a function to a class
我正在使用一个遗留的C库进行联网。例如,它允许我创建一个套接字服务器。我必须传递一个函数指针到库来处理协议-例如处理消息结构,头长度等。
在C程序中,你可以简单地传递一个指向函数的指针,例如get_protocol
。但是OO的方法是什么呢?
我有一个包装类,我们叫它socket_server
。我希望在运行时传递不同协议所需的函数指针的能力。
我该怎么做?这是战略模式要解决的问题吗?
编辑我喜欢std::function的想法,但是我们暂时被困在VS2008上,所以c++ 11还没有向我开放。
使用std::function
class Test
{
std::function<void()> func;
public:
Test(const std::function<void()> &func) : func(func) {}
void do_something()
{
func();
}
};
void my_func()
{
std::cout << "Hello" << std::endl;
}
int main()
{
Test test(my_func);
test.do_something();
}
基于模板的
template <typename Func>
class Test
{
Func *func;
public:
Test(const Func &func) : func(func) {}
void do_something()
{
func();
}
};
void my_func()
{
std::cout << "Hello" << std::endl;
}
int main()
{
Test<void()> test(my_func);
// Test<decltype(my_func)> test(my_func); // This is even better
test.do_something();
}
正如评论者建议的那样,您应该使用c++ 11的新特性std::function
。
就我个人而言,在c++ 03中我已经喜欢上了函子。整个<algorithm>
头都是亲函子,(当然现在c++ 11 std::function
)
函子是覆盖operator()
的对象,在此对象上可以调用()
来执行该函数。
您可以将operator()
看作一个"perform()"函数,就像一个简化的单策略。
struct Functor
{
void operator()(int param_a, const string& param_b)
{
// perform what you want
}
int my_member;
}
Functor f;
f(0,"go_std_function")
但除非你有充分的理由,否则请选择std::function
。它是手工函数的泛化,也是经典函数:任何可调用的:-)。
如果我没理解错的话。这就是你需要做的:
在头文件中,创建一个希望作为静态传递的函数。例如:
static void* ThreadWorker(void* worker);
在源文件中,您可以这样调用它:
pthread_create(&thread, NULL, ThreadWorker, (void *) worker);
函数必须是静态的,因为编译器不知道是哪个实例在调用它。但我相信有人能解释得更好。
这样做的"OO C"方式也将通过一个void *
值来允许将一些上下文传递给回调函数。传递的实际值将是一个指向回调函数能够理解的某种struct
的指针(在转换回实际类型之后)。这不是类型安全的,但它在实践中工作得很好,并且struct
可以很容易地保存指向c++对象的指针,从而允许将其关闭为一个相同的API。
如果没有这样的指针,你将被有效地限制为只调用静态方法作为回调(或者将对象引用放在全局变量中,这确实很糟糕!)当然,在这一点上,它也不再是一个真正的OO C接口,而是一些令人讨厌的东西,并且考虑重写或切换到构建在其他东西之上变得理智。
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中将函数压缩为两种方式
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 如何编写具有相同名称的相同函数,该函数在C++中几乎以相似的方式处理不同的类参数?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 请描述一下在 c++ 中在此类中定义构造函数的方式?
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 用于基于成员字段或函数创建比较器的快捷方式
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 我是否以错误的方式声明了getpriorityvalues函数
- 如何编写一个递归函数,以随机的方式混淆从0到6的数字
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 以编程方式在 C++ 中创建函数
- 将函数作为参数传递的两种方式之间的区别
- 程序按执行方式工作,直到我向其添加析构函数为止
- 在 C++ 中使用删除函数的不同方式
- 简单的计数和求和函数没有按照我预期的方式工作
- C++17 中函数参数的指针对齐方式
- 不同的构造函数方式