gpt4 book ai didi

c++ - 在自定义 const native C++ 容器类上支持 "for each"

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:45 26 4
gpt4 key购买 nike

我想实现一个简单的 native C++ 固定容量数组模板类,为了方便起见支持基于范围的“for each”语法,开销最小。

我在 const 实例上支持它时遇到问题。

有了这个实现:

template< class T, size_t Capacity >
class List
{
public:
List() { mSize = 0; }

const T* begin() const { return mItems; }
const T* end() const { return mItems + mSize; }

T* begin() { return mItems; }
T* end() { return mItems + mSize; }

private:
size_t mSize;
T mItems[ Capacity ];
};

和这种用法:

const List< int, 5 > myInts;
for each( const int myInt in myInts )
{
continue;
}

我收到这个错误:

error C2440: 'initializing' : cannot convert from 'const int *' to 'int *'
Conversion loses qualifiers

这种用法不会提示:

List< int, 5 > myInts;
for each( const int myInt in myInts )
{
continue;
}

而且这个(不受欢迎的)实现不会提示:

template< class T, size_t Capacity >
class List
{
public:
List() { mSize = 0; }

T* begin() const { return const_cast< List* >( this )->mItems; }
T* end() const { return const_cast< List* >( this )->mItems + mSize; }

private:
size_t mSize;
T mItems[ Capacity ];
};

背后到底发生了什么我不明白的事? std::vector<> 正确处理这个问题的原因是什么?谢谢!

最佳答案

你的用例对我来说似乎有点奇怪,因为你写下来的 C++ 中没有 for each constructs。 C++11 中引入了常规的 for 和基于范围的 for。我只能猜测您的真实用例是什么,但很可能编译器会因 const-correctness 错误而提示。如果没有您尝试运行的真实代码,我无法真正准确地确定您的错误。无论如何,下面是一个演示这两种用法的工作示例。希望对您有所帮助,但如果您有任何疑问,请随时跟进,我会尽力解释。

#include <cstdlib>
#include <iostream>

template <typename T, std::size_t Capacity>
class List {
public:
List() : mSize(0) {}

const T *begin() const { return mItems; }
const T *end() const { return mItems + mSize; }

T *begin() { return mItems; }
T *end() { return mItems + mSize; }

void add(int v)
{
// TODO: Check for out of range here...
mItems[mSize++] = v;
}

private:
size_t mSize;
T mItems[Capacity];
};

int main()
{
/* const */ List<int, 10> array;

array.add(1);
array.add(11);
array.add(15);
array.add(3);

// C++11 style (range-based for)
for (int p : array) {
std::cout << p << '\n';
}

// Pre C++11 style
for (const int *from = array.begin(), *to = array.end(); from != to; ++from)
{
int p = *from;
std::cout << p << '\n';
}
}

关于c++ - 在自定义 const native C++ 容器类上支持 "for each",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13794995/

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