OO方式将函数传递给类

OO way to pass a function to a class

本文关键字:函数 方式 OO      更新时间:2023-10-16

我正在使用一个遗留的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接口,而是一些令人讨厌的东西,并且考虑重写或切换到构建在其他东西之上变得理智。