代码之家  ›  专栏  ›  技术社区  ›  GreyCat

C++参数类型,用于接受适用于基于范围的for循环的所有序列

  •  3
  • GreyCat  · 技术社区  · 7 年前

    例如,我有一个这样的函数,它使用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循环依赖于 begin() end() 给定的方法 range_expression 。通常,在其他语言中,这意味着所有iterable容器都共享某种公共接口,可用于为此类参数传递任意容器,但C++似乎没有这样的容器层次结构。相反,C++似乎有“概念”,如 Container ,但我想它只能在编译器内部访问?

    2 回复  |  直到 7 年前
        1
  •  6
  •   rak007    7 年前

    我想这可以达到目的

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

    通过概念,你可以改变@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++'s容器 已经 符合(系列)公共接口,但该接口是 编译时间 建筑概念提供给您的是用于指定这些接口的语言工具,而不是文档(或规范)工具。