我有如下内容:
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);
这使用int
到bool
的标准转换。
如果要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 实现中已经只是一个整数,你当然可以写一些东西来做到这一点。 我不明白这样做的意义或为什么函数包含在结构中。 主要问题是为什么您希望函数采用参数以便可以忽略它们? 为什么不让函数返回布尔值而不是整数?