如何否定`std :: bind`提供的谓词?

时间:2018-02-22 08:36:55

标签: c++

对于通用算法,我们可以使用std::bind来提供谓词。 我们怎么能否定这个谓词?

作为示例,请考虑一个程序,该程序在vector中找到可分割中的第一个元素。

bool is_divisible(int m, int n)
{
    return m % n == 0;
}
int main()
{
    vector<int> v = { 3, 6, 9, 11, 15 };
    int n = 3;
    auto it = find_if(v.cbegin(), v.cend(), bind(is_divisible, _1, n));
    return 0;
}

现在我想通过否定bind提供的谓词来找到第一个不可分割的元素。我该怎么办?

我试过了

auto it = find_if(v.cbegin(), v.cend(), not1(bind(is_divisible, _1, n)));

产生以下错误

error: no type named 'argument_type' in 
'struct std::_Bind<bool(*(std::_Placeholder<1>, int))(int, int)>' class unary_negate

请不要建议使用lambdas或find_if_not,这不是此问题的目的。

非常感谢!

5 个答案:

答案 0 :(得分:4)

由于您喜欢bind,只需bind一些:

find_if(v.cbegin(), v.cend(), std::bind(std::logical_not<bool>(),
                                        std::bind(is_divisible, _1, n)));

(当然,如果你有权访问C ++ 17 not_fn,你可以使用它。)

答案 1 :(得分:3)

你可以使用替换的:std::not_fn(C ++ 17):

auto it = find_if(v.cbegin(), v.cend(), not_fn(bind(is_divisible, _1, n)));

答案 2 :(得分:1)

如果您有能力的编译器和标准库,可以使用std::not_fn完成:

auto it = std::find_if(v.cbegin(), v.cend(), not_fn(bind(is_divisible, _1, n)));

转发,并否定任何谓词仿函数的结果。

答案 3 :(得分:1)

试试这个

auto it = find_if(v.cbegin(), v.cend(), not1<function<bool (int)>>(bind(is_divisible, std::placeholders::_1, n)));

答案 4 :(得分:0)

您可以添加第三个参数,用于说明您是否正在寻找可分割元素:

bool is_divisible(int m, int n, bool is_divisible)
{
    return is_divisible == (m % n == 0);
}