为什么有些STL算法提供额外的"_if"函数而不是重载?

Why do some STL algorithms provide an additional '_if' function instead of overloading?

本文关键字:函数 if 重载 STL 算法 为什么      更新时间:2023-10-16

为什么一些STL算法提供额外的'_if'函数而不是重载它?

// example:
find(beg, end, val);
find_if(beg, end, pred);

他们就不能重载那些算法而不是制作额外的_if函数吗?

重载解析一般如何工作尚不清楚。比如说,如果容器包含谓词怎么办?

struct pred
{
  bool operator()(const pred&) const;
  friend bool operator==(const pred&,const pred&);
};
std::vector<pred> v;
pred p;
std::find(v.begin(), v.end(), p); // what should happen here?

通过使用不同的函数名称来避免这种潜在的歧义,每个名称都能更清楚地表达意图。

注意这是一个简化:在std::find中没有要求引用对象与容器的value_type具有相同的类型,只是要求它们在相等方面具有可比性。std::find_if中对谓词的要求同样是通用的。这两个函数都是非常通用的,这意味着比给出的示例更容易产生歧义。例如,

struct foo {};
struct pred
{
  bool operator()(const foo&) const;
};
bool operator==(const foo&, const pred&);
int main()
{
  std::vector<foo> v;
  pred p;
  std::find(v.begin(), v.end(), p);    // What should this do?
  std::find_if(v.begin(), v.end(), p); // Here, it is clear.
}

这些算法提供命名版本而不是重载版本,因为两个版本的算法接受相同数量的实参。因此,可能会出现重载歧义。

为了避免任何可能的歧义,库为这些算法提供了单独的命名版本,find_if就是其中之一。