Как преобразовать функцию, которая возвращает int, в функцию, которая возвращает bool, используя boost :: bind?

У меня есть что-то вроде следующего:

 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

Решение

Если доступен 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 ()
ложный
2

Другие решения

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)"

1

Я не совсем уверен насчет библиотеки boost :: bind и того, как обрабатывать ваш случай, но если у вас есть среда с поддержкой C ++, вы можете использовать лямбду вместо bind:

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

С поддержкой лямбды внезапно связывание не кажется таким отличным инструментом 🙂

1

Boolean true / false уже является целым числом в реализациях C, и вы, конечно, могли бы написать что-то для этого. Я не понимаю смысла делать это или почему функция содержится в структуре. Главный вопрос: почему вы хотите, чтобы функция принимала параметры, чтобы их можно было игнорировать? Почему бы не сделать так, чтобы функция возвращала bool вместо int?

0
По вопросам рекламы [email protected]