6

我需要调用一个需要函数指针的方法,但我真正想要传递给它的是函子。这是我正在尝试做的一个例子:

#include <iostream>
#include "boost/function.hpp"

typedef int (*myAdder)(int);

int adderFunction(int y) { return(2 + y); }

class adderClass {
  public:
    adderClass(int x) : _x(x) {}  
    int operator() (int y) { return(_x + y); }

  private:
    int _x;
};

void printer(myAdder h, int y) {
  std::cout << h(y) << std::endl;
}

int main() {
  myAdder f = adderFunction;

  adderClass *ac = new adderClass(2);
  boost::function1<int, int> g =
    std::bind1st(std::mem_fun(&adderClass::operator()), ac);

  std::cout << f(1) << std::endl;
  std::cout << g(2) << std::endl;
  printer(f, 3);
  printer(g, 4); // Is there a way to get this to work?
}

我一直无法找到编译最后一行printer(g, 4) 的方法。有没有办法让它工作?我唯一能控制的是方法“main”和类“adderClass”。

4

3 回答 3

2

好的,这是另一个尝试:

class CallProxy
{
public:
    static adderClass* m_instance;
    static int adder(int y)
    {
        return (*m_instance)(y);
    }
};

adderClass* CallProxy::m_instance = NULL;


int main() {
    myAdder f = adderFunction;

    adderClass ac(2);

    std::cout << f(1) << std::endl;
    std::cout << ac(2) << std::endl;
    printer(f, 3);
    CallProxy::m_instance = &ac;
    printer(CallProxy::adder, 4); 
}

问题是你已经printer编译为必须接收一个函数指针而没有别的,所以你必须向它发送一个函数指针。使用函数指针,您就没有人持有您的实例。所以这个解决方案通过使用静态数据成员来做到这一点。

请注意,这会使此代码不是线程安全的。同时执行的两个线程main可能会在 m_instance 中放入两个不同的东西。

于 2009-12-11T14:21:50.907 回答
0

像这样:

template<typename AdderT>
void printer(AdderT h, int y) {
  std::cout << h(y) << std::endl;
}

此外,您不需要boost::function. 你可以这样做:

  adderClass ac(2);
  std::cout << f(1) << std::endl;
  std::cout << ac(2) << std::endl;
  printer(f, 3);
  printer(ac, 4);
于 2009-12-11T13:58:30.117 回答
0

虽然 boost 函数的行为类似于普通函数指针,但它是不同的类型。因此,您不能只将 boost 函数分配给函数指针。

在您的代码中,您可以简单地替换

typedef int (*myAdder)(int);

typedef boost::function1< int, int > myAdder;

一切都会奏效。

于 2009-12-11T14:10:04.483 回答