【发布时间】:2018-04-05 15:17:08
【问题描述】:
例如,我有一个这样的函数,它使用 C++11 range-based for loop 语法:
void myFunc(const std::vector<char>& bytes) {
for (char b : bytes) {
// do something useful to every byte
}
}
如何更改此函数声明以接受每个合适的序列容器,即不仅std::vector<char>,还包括std::array<char>、std::string 等?
据我所知,基于范围的 for 循环依赖于给定 range_expression 的 begin() 和 end() 方法的存在。通常,在其他语言中,这意味着所有可迭代容器共享某种通用接口,可用于为此类参数传递任意容器,但看起来 C++ 没有这样的容器层次结构。相反,C++ 似乎有“概念”,比如Container,但我猜它只能在编译器内部访问?
【问题讨论】:
-
我认为这个 SO 问题/答案可能会有所帮助:stackoverflow.com/questions/8164567/…
-
@Eljay 这个问题回答了问题的一种反面——即“鉴于现有的 for 循环,我如何准备我的自定义类型以在那里被接受”。我的问题是标准类型,我如何准备函数来接受所有这些?
-
模板是编译时的静态接口,而ABCs 是大多数其他语言唯一的接口形式,是运行时接口。知道区别:) 概念只是模板类型的约束,即可以或不能替代
T的内容。我相信它还没有成为标准。 -
@GreyCat 这可以帮助你:stackoverflow.com/questions/25224002/…
-
我通常不推荐维基百科的文章,但在这种情况下,我认为这是个好主意:en.wikipedia.org/wiki/Concepts_(C%2B%2B)。简短的故事是,概念目前类似于文档,并且试图将它们变成真实的、有形的编译器功能已经存在了几十年,但没有将它们纳入任何新的 C++ 标准。然而。
标签: c++ stl containers