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 可用,请考虑使用 lambda。否则,您可以使用 Boost.Lambda:

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

int这使用to的标准转换bool

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() 内
错误的
于 2012-12-11T23:20:33.997 回答
1

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

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

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

于 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

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

于 2012-12-11T23:02:45.930 回答