【发布时间】:2020-08-18 21:03:48
【问题描述】:
我正在实现一个函数,该函数希望遍历 std::array 中的多个元素,但我并不关心 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>,我对此很满意。我的问题是,是否有另一种方法来指定此函数所需的迭代器?
更新
有些事情我应该提一下。当然,这段代码是更大范围的一部分,我试图尽可能多地隐藏细节。
- 我想确保使用的迭代器是
bools。 - 我使用的是 C++14
- 该函数是类接口的一部分,我希望能够处理多个数组大小。我不想打扰接口的实现者确切知道数组的大小。
class MyInterface
{
public:
virtual foo(std::array<bool,0>::const_iterator begin, std::array<bool,0>::const_iterator end) = 0;
~MyInterface() = default;
};
我记得虚函数不能被模板化。这意味着我必须对我的整个界面进行模板化,而这将完全失去我最初尝试这个的原因。
【问题讨论】:
-
您可以提取数组大小作为该函数的模板参数。
-
您想要
std::array<bool, N>的 迭代器还是an 迭代器?由于std::array<bool,N>是连续的,bool*是它的有效迭代器类型。 -
@MSalters 我正在尝试使用某种现代方法,而不是使用诸如布尔指针之类的简单类型,尽管它可能是我想要实现的最佳解决方案。但我首先在寻找替代品,因此是这个问题。感谢您的建议。
-
@Marnix:“现代方法”意味着我们对
new bool和new bool[ ]使用智能指针。仍然可以使用bool*作为指向连续bool[ ]的非拥有指针。不像我们现在使用std::pointer<bool>,虽然在C++20中有std::span<bool>
标签: c++ arrays c++14 const-iterator