3

我有几个具有类似声明的函数:

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就像一个可以接受的通用函数指针foobar并且test

这可能吗?

顺便说一句,我的项目中目前没有 C++11 和 boost,只使用 TR1。

4

5 回答 5

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

于 2013-07-31T08:25:46.017 回答
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,在其中将要调用的函数作为参数传递...

于 2013-07-31T08:20:43.290 回答
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);
}
于 2013-07-31T08:39:40.487 回答
1

是的。利用

void Handle(int a, int(*func)(int)) {
  process(a);
  int ret = (*func)(a);
}

像这样使用:

Handle(some_a, &foo);

注意:您发布的三个函数作为示例 return void,我怀疑是拼写错误并将它们替换为int

于 2013-07-31T08:19:06.143 回答
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);
}
于 2013-07-31T08:21:47.390 回答