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同時に実行される 2 つのスレッドは、m_instance に 2 つの異なるものを入れることがあります。

于 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

ブースト関数は通常の関数ポインターのように動作しますが、タイプが異なります。したがって、ブースト関数を関数ポインターに割り当てることはできません。

あなたのコードでは、単に置き換えることができます

typedef int (*myAdder)(int);

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

そしてすべてがうまくいくでしょう。

于 2009-12-11T14:10:04.483 に答える