为什么有些STL算法会提供额外的' _if'功能而不是重载?

时间:2015-05-19 22:25:03

标签: c++ c++11 stl stl-algorithm

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

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

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

2 个答案:

答案 0 :(得分:18)

目前尚不清楚过载分辨率如何一般地起作用。例如,如果容器包含谓词?

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.
}

答案 1 :(得分:11)

这些算法提供了命名版本而不是重载版本,因为算法的两个版本都使用相同数量的参数。因此可能会出现过度模糊的情况。

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