У меня есть что-то вроде следующего:
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, рассмотрите возможность использования лямбды. В противном случае вы можете использовать Boost.Lambda:
boost::function<bool(int x, int y)> purp = !!boost::lambda::bind(&A::derp, this);
Это использует стандартное преобразование int
в 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 () ложный
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)"
Я не совсем уверен насчет библиотеки boost :: bind и того, как обрабатывать ваш случай, но если у вас есть среда с поддержкой C ++, вы можете использовать лямбду вместо bind:
auto purp = [=](int,int) -> bool { return derp(); };
// alternatively:
//std::function<bool(int,int)> purp = [](int,int)->bool{return derp();};
С поддержкой лямбды внезапно связывание не кажется таким отличным инструментом 🙂
Boolean true / false уже является целым числом в реализациях C, и вы, конечно, могли бы написать что-то для этого. Я не понимаю смысла делать это или почему функция содержится в структуре. Главный вопрос: почему вы хотите, чтобы функция принимала параметры, чтобы их можно было игнорировать? Почему бы не сделать так, чтобы функция возвращала bool вместо int?