我正在使用旧版C库进行联网。它允许我创建一个套接字服务器。我必须传递一个函数指针到库来处理协议 - 例如处理消息结构,标题长度等内容。
在C程序中,您只需将指针传递给函数,例如get_protocol
。但是OO的方法是什么。
我有一个包装类,我们称之为socket_server
。我希望能够在运行时传入不同协议的必需函数指针。
我该怎么做?这是策略模式解决的问题吗?
修改
我喜欢std :: function的想法,但我们暂时停留在VS2008上,所以C ++ 11还没有对我开放。
答案 0 :(得分:2)
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();
}
答案 1 :(得分:1)
正如评论者建议您应该使用C ++ 11新功能std::function
。
个人而言,在C ++ 03中,我已经喜欢了仿函数。整个<algorithm>
标题是pro-functors,(当然现在是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
。它是手工编写器的概括,也是经典函数:任何可调用的东西: - )。
答案 2 :(得分:0)
如果我正确理解你。这是你需要做的:
在Header文件中,创建一个要作为静态传递的函数。例如:
static void* ThreadWorker(void* worker);
在您的源文件中,您可以这样称呼它:
pthread_create(&thread, NULL, ThreadWorker, (void *) worker);
该函数必须是静态的,因为编译器不知道哪个实例正在调用它。但我相信有人可以更好地解释它。
答案 3 :(得分:0)
“OO C”这样做的方法是通过void *
值来允许将一些上下文传递给回调函数。传递的实际值将是指向回调函数将理解的某种struct
的指针(在转换回实际类型之后)。这不是类型安全的,但它在实践中非常有效,并且struct
可以轻松地保存指向C ++对象的指针,从而允许将thunk关闭为一个合理的API。
如果没有这样的指针,你实际上只限于调用静态方法作为你的回调(或者将对象引用放在全局变量中,这确实令人讨厌!)当然,那时它已经不再是真的了也可以是OO C接口,但更糟糕的是,考虑重写或切换到其他东西之上构建它会变得很明智。