我有以下内容:
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(); }
但是想避免将其创建为成员函数,而只是在可能的情况下在本地创建它?
答案 0 :(得分:2)
如果C ++ 11可用,请考虑使用lambda。否则,您可以使用Boost.Lambda:
boost::function<bool(int x, int y)> purp = !!boost::lambda::bind(&A::derp, this);
使用int
到bool
的标准转换。
如果您希望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?