为什么某些 STL 算法提供额外的“_if”函数而不是重载?
Why do some STL algorithms provide an additional '_if' function instead of overloading?
为什么一些 STL 算法提供额外的 '_if'
函数而不是重载它?
// example:
find(beg, end, val);
find_if(beg, end, pred);
难道他们不能只重载这些算法而不是创建额外的 _if
函数吗?
这些算法提供了命名版本而不是重载版本,因为算法的两个版本都采用相同数量的参数。因此,可能会出现重载歧义。
为了避免任何可能的歧义,库为这些算法提供了单独的命名版本,find_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.
}
为什么一些 STL 算法提供额外的 '_if'
函数而不是重载它?
// example:
find(beg, end, val);
find_if(beg, end, pred);
难道他们不能只重载这些算法而不是创建额外的 _if
函数吗?
这些算法提供了命名版本而不是重载版本,因为算法的两个版本都采用相同数量的参数。因此,可能会出现重载歧义。
为了避免任何可能的歧义,库为这些算法提供了单独的命名版本,find_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.
}