为什么有些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
函数吗?
重载解析一般如何工作尚不清楚。比如说,如果容器包含谓词怎么办?
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
就是其中之一。
相关文章:
- Insert函数不适用于2 if语句C++
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 在 if 语句中调用重载构造函数失败
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 简化 if 流函数的 while 循环中的大量 while 循环
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- if-else 与三元函数调用性能
- 函数如何在不这样做的情况下在新线程上运行"as if"?
- 无法编译包含"if constexpr"的函数模板实例化
- 性能:否则如果 vs if 在已经返回的函数中
- 重构模板函数中的常量表达式 if 语句
- if, else if, else 函数未准确显示结果
- 为什么 if 语句对于运算符重载函数计算 false
- 使用 if/else if 的函数输出问题
- 'if constexpr branch'不会在模板函数内的 lambda 中被丢弃
- C++创建一个类似于 while、if 或 for 的函数
- 如何正确使用这个函数的if语句?
- 函数'If'的隐式声明
- 使用模板检查结构体中的字段,启用函数if,并在失败时给出一个漂亮的错误消息