gpt4 book ai didi

c++ - 将 std::conditional 与迭代器一起使用

转载 作者:行者123 更新时间:2023-12-04 00:49:50 25 4
gpt4 key购买 nike

在“掌握 C++17 STL”一书中,我看到在一个类中使用条件来实现迭代器和 const_iterator 以减少代码重复

这是我对简单数组类的实现(跳过了数组类的大部分代码):

template<class T, size_t N>
class Array
{
public:
template<bool Const>
class ArrayIterator {
friend class Array;
public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = std::conditional<Const, const value_type*, value_type*>;
using reference = std::conditional<Const, const value_type&, value_type&>;
using iterator_category = std::random_access_iterator_tag;

reference operator*() const { return *ptr; }
ArrayIterator<Const>& operator++() { ++ptr; return *this; }
ArrayIterator<Const> operator++(int) { auto res = *this; ++(*this); return res; }

template<bool R>
bool operator==(const ArrayIterator<R>& iter) const { return ptr == iter.ptr; }
template<bool R>
bool operator!=(const ArrayIterator<R>& iter) const { return ptr != iter.ptr; }

private:
explicit ArrayIterator(pointer p) : ptr(p) {};
pointer ptr;
};

using iterator = ArrayIterator<false>;
using const_iterator = ArrayIterator<true>;
iterator begin() { return iterator(data); }
iterator end() { return iterator(data + N); }
const_iterator cbegin() const { return const_iterator(data); }
const_iterator cend() const { return const_iterator(data + N); }

private:
T* data;
};

这段代码编译没有错误,但是迭代器有点不可用:

Array<int, 100> arr;
/*filling it with numbers*/
int x = *arr.begin();

给出错误:

main.cpp:9:9: error: no viable conversion from 'Array<int, 100>::ArrayIterator<false>::reference' (aka 'conditional<false, const int &, int &>') to 'int'

我该如何使用该迭代器,或者我应该放弃书中的这个想法?

最佳答案

ArrayIterator的成员类型pointerreference应该定义为的成员类型type std::conditional,不是 std::conditional 本身。

将它们更改为:

using pointer = typename std::conditional<Const, const value_type*, value_type*>::type;
// ^^^^^^^^ ^^^^^^
using reference = typename std::conditional<Const, const value_type&, value_type&>::type;
// ^^^^^^^^ ^^^^^^

或者(C++14 起)

using pointer = std::conditional_t<Const, const value_type*, value_type*>;
// ^^
using reference = std::conditional_t<Const, const value_type&, value_type&>;
// ^^

关于c++ - 将 std::conditional 与迭代器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67346580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com