如何否定boost :: lambda:bind?

时间:2011-06-28 14:13:21

标签: c++ lambda bind negate

假设我有这种类型:

typedef boost::function<bool (Foo)> filter_function;

这些“过滤函数”的向量:

std::vector<filter_function> filters;

如果想逐个调用所有过滤函数,只有最后一次调用返回true。

a previous question的启发,我最后写了:

bool Bar::filterFoo(Foo& foo)
{
  return (std::find_if(filters.begin(), filters.end(), boost::lambda::bind(boost::lambda::_1, foo)) == filters.end());
}

但这是错误的:lambda的返回值应该被否定。

我尝试在不同的地方使用std::not1std::not2,但找不到任何不会导致(非常详细的)编译错误的变体。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以简单地否定返回值。

bool Bar::filterFoo(Foo& foo)
{
  return (std::find_if(filters.begin(), filters.end(), !boost::lambda::bind(boost::lambda::_1, foo)) == filters.end());
}

或者您可以使用来自c ++ 0X的lambda

bool Bar::filterFoo(Foo& foo)
{
    return (std::find_if(filters.begin(), filters.end(), [&foo](filter_function& f){
        return !f(foo);
    }
    ) == filters.end());
}

显示至少适用于VS2010的完整示例。

#include <iostream>
#include <vector>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#include <boost/lambda/bind.hpp>

using namespace std;

struct Foo{};

typedef boost::function<bool (Foo)> filter_function;
std::vector<filter_function> filters;

static int g_c = 0;
bool MyFunc(Foo /*foo*/)
{
    if(g_c > 1)
        return true;
    g_c++;
    return false;
}
bool filterFoo(Foo& foo)
{
    return (std::find_if(filters.begin(), filters.end(), boost::lambda::bind(boost::lambda::_1, foo)) == filters.end());
}
bool negatefilterFoo(Foo& foo)
{
    return (std::find_if(filters.begin(), filters.end(), !boost::lambda::bind(boost::lambda::_1, foo)) == filters.end());
}

int main() 
{
    Foo f;
    filters.push_back(boost::bind(&MyFunc, _1));
    filters.push_back(boost::bind(&MyFunc, _1));
    filters.push_back(boost::bind(&MyFunc, _1));
    std::cout << filterFoo(f) << std::endl;
    std::cout << negatefilterFoo(f) << std::endl;
    return 0;
}

它在我的机器上返回0和1。