首页 > 解决方案 > 将 std::find 与用户提供的谓词一起使用 - 自制 find() 重载

问题描述

我有一个类,它本质上是一个std::vector<T>具有一些附加功能的类。该类具有find(const T& value )将返回第一次出现value或-1的索引的方法:

int my::find(const T& value) {
    auto iter = std::find(this->data.begin(), this->data.end(), value);
    if (iter == this->data.end())
        return -1;

    return std::distance(this->data.begin(), iter);
}

都好。然后,我想创建一个find()重载,它采用任意谓词而不是值 - 我尝试过:

int my::find(const std::function<bool(const T&)>& pred) {
    auto iter = std::find(this->data.begin(), this->data.end(), pred);
    ...
}

并且:

template <typename P>
int my::find(P&& pred) {
    auto iter = ...
}

但是这两种情况都无法编译,因为“编译器”试图在类型值pred的向量中查找,而不是应用于值,即当我实例化时,我得到编译器错误,例如:predpredmy<int>

/usr/include/c++/5/bits/predefined_ops.h:194:17: error: no match for ‘operator==’ (operand types are ‘int’ and ‘const std::function<bool(const int&)>’)
  { return *__it == _M_value; }

标签: c++

解决方案


该算法std::find将始终将其第三个参数视为与给定序列中的元素进行比较的值operator==。您传入的谓词无法与T类的实例进行比较,因此会出现编译器错误。

您正在寻找std::find_if(overloads #3-4),它将谓词作为第三个参数。


推荐阅读