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

标签 c++

对于通用算法,我们可以使用 std::bind 来提供谓词。 我们如何否定该谓词?

例如,考虑一个程序,该程序在 vector 中找到第一个可以被 3 整除的元素。

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 提供的谓词来找到 不能被 3 整除 的第一个元素。我该怎么做?

我试过了

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

请不要建议使用 lambda 或 find_if_not,这不是本题的目的。

非常感谢!

最佳答案

既然你喜欢bind,就再bind一些:

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

(当然,如果您可以访问 C++17 not_fn,您可以直接使用它。)

关于c++ - 如何否定 `std::bind` 提供的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48922850/

相关文章:

c++ - 如何解释标准中的以下段落?

c++如何在创建新结构时将NULL值分配给成员指针

c++ - 如何通过蓝牙套接字(RFCOMM、SPP)仅发送一个字节或如何刷新蓝牙套接字(RFCOMM、SPP)?

c++ - 在不解析 C++ 的情况下将 html 转换为纯文本?

c++ - vector<bool> 可以由 int 初始化吗

C++11 使用右值的最佳实践

c++ - LNK 2019 "Unresolved External Symbol"错误(C++ OpenGL)

c++ - 读取二进制文件并打印其内容(Web 服务器)

c++ - 该标准是否指定按值捕获的 lambda 是捕获父对象,还是仅捕获被访问的成员?

c# - c++调用opencv相关函数并打包成dll,c#调用不了