【问题标题】:C++ parameter type to accept all sequences suitable for range-based for loopC++ 参数类型接受所有适合基于范围的 for 循环的序列
【发布时间】: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&lt;char&gt;,还包括std::array&lt;char&gt;std::string 等?

据我所知,基于范围的 for 循环依赖于给定 range_expressionbegin()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


【解决方案1】:

我认为这可以解决问题

template<typename T>
void myFunc(const T& bytes) {
    for (auto b : bytes) {
        // do something useful to every byte
    }
}

【讨论】:

  • 这只是一个普通的模板化函数——除了实例化时,它不会提供类型检查,如果要放入库中,我必须实例化所有可能的类型参数无论如何。有没有更好的办法?
  • 你想在你的程序中实现什么不清楚。你能给我们更多的背景信息吗?
  • @GreyCat 如何更改此函数声明以接受每个合适的序列容器,即不仅std::vector,而且std::array,std: :string 等? 这就是答案,使用模板。如果你需要别的东西,你需要清楚你的问题。顺便说一句,模板应该放在头文件中,而不是放在库中。如果您需要放入库,请考虑继承
  • @GreyCat 这将不提供类型检查,除非在实例化时这是唯一一次完成类型检查。您是否正在寻找模板受限的 this 之类的东西?
  • @NathanOliver 我认为这就是他的意思,因此应该是答案
【解决方案2】:

通过概念,您可以转换 @rak007 的

template<typename T>
void myFunc(const T& bytes) {
    for (auto b : bytes) {
        // do something useful to every byte
    }
}

进入(无限)更明确的

template<Container T>
void myFunc(const T& bytes) {
    for (auto b : bytes) {
        // do something useful to every byte
    }
}

C++ 的容器已经符合一个(系列)通用接口,但该接口是一个编译时结构。 Concepts 为您提供的是指定这些接口的语言工具,而不是文档(或规范)工具。

【讨论】:

  • 我还要补充一点,C++20 标准中没有这样的容器概念,只有范围概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2021-04-08
相关资源
最近更新 更多