如何将返回int的函数转换为使用boost :: bind返回bool的函数?

时间:2012-12-11 22:50:37

标签: c++ boost boost-bind

我有以下内容:

 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  **/;
  }
 }

有什么想法吗?我想创建函数prup,它基本上调用derp并忽略传入的(x,y)。

我需要像

这样的东西
bool purp(int x, int y){ return derp(); }

但是想避免将其创建为成员函数,而只是在可能的情况下在本地创建它?

4 个答案:

答案 0 :(得分:2)

如果C ++ 11可用,请考虑使用lambda。否则,您可以使用Boost.Lambda:

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

使用intbool的标准转换。

如果您希望A::derp的特定返回值为true,请使用==。例如,假设您希望返回值为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();
}

输出:

within A::derp()
false

答案 1 :(得分:1)

我不太确定boost :: bind库以及如何处理你的情况,但如果你有一个启用C ++的环境,你可以使用lambda来代替bind:

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

使用lambda支持突然绑定似乎不是一个很好的工具:)

答案 2 :(得分: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)"

答案 3 :(得分:0)

布尔值true / false只是C实现中的一个整数,你当然可以写一些东西来做这件事。我不明白这样做的意义或者为什么函数包含在结构中。主要问题是为什么你想要一个函数来获取参数,以便可以忽略它们?为什么不让函数返回bool而不是int?