0

私は次のようなものを持っています:

 struct A{
  virtual int derp(){ 
      if(herp()) return 1; 
      else return 0; 
   }
  void slurp(){
    boost::function<bool(int x, int y)> purp = /** boost bind derp to match lvalue sig  **/;
  }
 }

何か案は?基本的にderpを呼び出し、渡された(x、y)を無視する関数prupを作成したいと思います。

私はのようなものが必要です

bool purp(int x, int y){ return derp(); }

ただし、メンバー関数として作成するのではなく、可能であればローカルで作成するだけにしますか?

4

4 に答える 4

2

C ++ 11が利用可能な場合は、ラムダの使用を検討してください。それ以外の場合は、Boost.Lambdaを使用できます。

boost::function<bool(int x, int y)> purp = !!boost::lambda::bind(&A::derp, this);

これは、の標準変換を使用intboolます。

A::derpの特定の戻り値をにしたい場合はtrue、を使用します==。たとえば、戻り値3を次のようにしたいとしますtrue

boost::function<bool(int x, int y)> purp = boost::lambda::bind(&A::derp, this) == 3;

編集:完全な例:

#include <iostream>

#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

struct A {
    virtual int derp() {
        std::cout << "within A::derp()\n";
        return 0;
    }
    void slurp() {
        boost::function<bool(int x, int y)> purp = !!boost::lambda::bind(&A::derp, this);
        std::cout << (purp(3, 14) ? "true" : "false") << '\n';
    }
};

int main()
{
    A a;
    a.slurp();
}

出力:

A :: derp()内
false
于 2012-12-11T23:20:33.997 に答える
1

boost::bind ライブラリとケースの処理方法についてはよくわかりませんが、C++ が有効な環境がある場合は、バインドの代わりにラムダを使用できます。

auto purp = [=](int,int) -> bool { return derp(); };
// alternatively:
//std::function<bool(int,int)> purp = [](int,int)->bool{return derp();};

ラムダのサポートにより、突然 bind はそれほど優れたツールのようには見えません:)

于 2012-12-11T23:11:47.947 に答える
1
boost::function<bool(int x, int y)> purp = boost::bind(&A::derp, this);

derpこれは、戻り値が暗黙的に に変換可能である限り機能するはずboolです。ただし、VC++ では次の迷惑な警告が表示されます。"warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)"

于 2012-12-11T23:16:51.887 に答える
0

ブールtrue/falseは、すでにC実装では単なる整数であり、これを行うために何かを書くことができます。これを行う意味や、関数が構造体に含まれている理由がわかりません。主な質問は、なぜ関数がパラメータを取得して無視できるようにするのかということです。関数にintの代わりにboolを返さないのはなぜですか?

于 2012-12-11T23:02:45.930 に答える