如何使用 boost::bind 将返回 int 的函数转换为返回布尔值的函数



我有如下内容:

 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(); }

但是想要避免将其创建为成员函数,而是尽可能在本地创建它?

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

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

这使用intbool的标准转换。

如果要true特定的返回值 A::derp ,请使用 == 。例如,假设您希望返回值 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::d erp() 中假
boost::function<bool(int x, int y)> purp = boost::bind(&A::derp, this);

只要返回值隐式转换为bool derp这应该有效。不过,使用 VC++ 时,您会收到这个烦人的警告: "warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)"

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

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

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

布尔值 true/false 在 C 实现中已经只是一个整数,你当然可以写一些东西来做到这一点。 我不明白这样做的意义或为什么函数包含在结构中。 主要问题是为什么您希望函数采用参数以便可以忽略它们? 为什么不让函数返回布尔值而不是整数?

最新更新