foreach — поддержка & quot; для каждого & quot; на пользовательском константном родном классе контейнера C ++

Я хотел бы реализовать простой собственный шаблонный массив массива C ++ с фиксированной емкостью, поддерживающий основанный на диапазоне «для каждого» синтаксис для удобства с минимальными издержками.

У меня проблемы с поддержкой в ​​постоянных случаях.

С этой реализацией:

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<> Это правильно обрабатывает? Спасибо!

4

Решение

Ваш вариант использования кажется мне немного странным, поскольку для каждой конструкции в C ++ нет такой, какой вы ее записали. Есть регулярный for и на основе диапазона for введено в C ++ 11. Я могу только догадываться, каков ваш реальный вариант использования, но, скорее всего, компилятор жалуется из-за ошибки константности. Я не могу точно определить вашу ошибку без реального кода, который вы пытаетесь запустить. В любом случае ниже приведен рабочий пример, демонстрирующий оба варианта использования. Надеюсь, что это полезно, но если у вас есть какие-либо вопросы — не стесняйтесь, я постараюсь объяснить.

#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';
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]