首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::array::iterator忽略大小模板

std::array::iterator忽略大小模板
EN

Stack Overflow用户
提问于 2020-05-04 12:26:12
回答 4查看 174关注 0票数 1

我正在实现一个函数,它希望循环一个std::数组中的许多元素,但我并不关心std::array有多长时间。所以我想到了以下功能:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <array>
#include <iterator>

void foo(std::array<bool,0>::const_iterator begin, std::array<bool,0>::const_iterator end)
{
    printf("iterator");
}

int main()
{
    std::array<bool, 25> one;
    std::array<bool, 33> two;

    foo(one.cbegin(), one.cend());
    foo(two.cbegin(), two.cend());
}

我对此非常满意,除了std::array<bool,0>。我的问题是,是否有另一种方法来指定此函数所需的迭代器?

更新

有些事我应该提一下。当然,这段代码是更大范围的一部分,我试图尽可能地隐藏更多的细节。

  1. 我想确保所使用的迭代器是bool的。
  2. 我正在使用C++14
  3. 该函数是类接口的一部分,我希望能够处理多个数组大小。我不想麻烦接口的实现者确切知道数组的大小。
代码语言:javascript
运行
复制
class MyInterface
{
public:
    virtual foo(std::array<bool,0>::const_iterator begin, std::array<bool,0>::const_iterator end) = 0;

    ~MyInterface() = default;
};

我记得虚拟函数不能被模板化。这意味着我将不得不模板我的整个界面,这将完全失去了为什么我要尝试这一点。

EN

Stack Overflow用户

发布于 2020-05-04 12:34:59

只需使用span

代码语言:javascript
运行
复制
#include <array>
#include <span>

class MyInterface {
public:
    virtual void foo(std::span<bool> barr) = 0;

    // interface destructors should be virtual
    virtual ~MyInterface() = default;
};

void bar(MyInterface& interface) {
    std::array<bool, 42> arr;
    interface.foo(arr);
}

如果您无法访问C++20编译器,则可以使用来自谷胱甘肽gsl::span

票数 3
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61592200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档