我有几个具有类似声明的函数:
int foo(int a);
int bar(int a);
int test(int a);
我的消息处理程序的逻辑完全相同:
void HandleFoo(int a) {
process(a);
int ret = foo(a);
if (ret)
print(a);
}
void HandleBar(int a) {
process(a);
int ret = bar(a);
if (ret)
print(a);
}
void HandleTest(int a) {
process(a);
int ret = test(a);
if (ret)
print(a);
}
所以我想知道是否可以编写一般函数:
void Handle(int a, func_pointer fn) {
process(a);
int ret = fn(a);
if (ret)
print(a);
}
fn
就像一个通用函数指针,可以接受foo
,bar
和test
这可能吗?
顺便说一句,目前没有C ++ 11和我的项目中的提升,只使用TR1。
答案 0 :(得分:4)
您可以使用模板
示例(不是您的代码):
int add1(int n) { return n+1; }
int add2(int n) { return n+2; }
template<typename Adder>
void AddHandler(int n, Adder adder)
{
int r = adder(n);
std::cout << r << std::endl;
}
int main(void)
{
AddHandler(1, add1);
AddHandler(3, add2);
return 0;
}
按预期输出:
2
5
你可以在这里看到http://ideone.com/q3FyI5
答案 1 :(得分:2)
将函数转换为仿函数,即
struct foo
{
int operator()(int a) {}
};
struct bar
{
int operator()(int a) {}
};
struct test
{
int operator()(int a) {}
};
然后上一个方法有效,略微调整
template <typename Functor>
void Handle(int a)
{
process(a);
int ret = Functor()(a); // <- tweak, instantiate functor and then call
if (ret)
print(a);
}
你可以采用这种方法或@ undu's传递函数作为参数调用...
答案 2 :(得分:1)
是的。使用
void Handle(int a, int(*func)(int)) {
process(a);
int ret = (*func)(a);
}
像这样使用:
Handle(some_a, &foo);
注意:您发布的三个函数作为示例返回void
,我怀疑是拼写错误,并将其替换为int
。
答案 3 :(得分:1)
typedef int (*fptr)(int ) ;
void Handle(int a, fptr fn) {
process(a);
int ret = fn(a);
if (ret)
print(a);
}
int main()
{
Handle(3,foo);
Handle(4,bar);
Handle(5,test);
}
答案 4 :(得分:0)
使用
void Handle(int a, bool(*fn)(int) ) {
process(a);
int ret = fn(a);
if (ret)
print(a);
}
或者,
typedef bool (*func_pointer)(int);
void Handle(int a, func_pointer fn ) {
process(a);
int ret = fn(a);
if (ret)
print(a);
}