我正在实现一个函数,它希望循环一个std::数组中的许多元素,但我并不关心std::array有多长时间。所以我想到了以下功能:
#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>。我的问题是,是否有另一种方法来指定此函数所需的迭代器?
更新
有些事我应该提一下。当然,这段代码是更大范围的一部分,我试图尽可能地隐藏更多的细节。
bool的。class MyInterface
{
public:
    virtual foo(std::array<bool,0>::const_iterator begin, std::array<bool,0>::const_iterator end) = 0;
    ~MyInterface() = default;
};我记得虚拟函数不能被模板化。这意味着我将不得不模板我的整个界面,这将完全失去了为什么我要尝试这一点。
发布于 2020-05-04 12:31:20
您只需将其作为函数模板
template <typename I>
void foo(I begin, I end)
{
    std::cout << "iterator";
}您不需要关心容器类型(以及大小),您可以传递std::array、std::vector和std::string等迭代器,甚至是原始指针(这也满足迭代器的要求)。
发布于 2020-05-04 12:34:59
只需使用span
#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);
}发布于 2020-05-04 12:27:24
使用模板:
template <size_t N>
void foo(std::array<bool,N>::const_iterator begin, std::array<bool,N>::const_iterator end)
{
    printf("iterator");
}现在,只要两个迭代器都来自一个大小为N的数组,这个函数就能工作。
如果要接受来自不同大小数组的迭代器,只需为第二个迭代器添加另一个模板参数,如
template <size_t N, size_t M>
void foo(std::array<bool,N>::const_iterator begin, std::array<bool,M>::const_iterator end)
{
    printf("iterator");
}https://stackoverflow.com/questions/61592200
复制相似问题