Ну, я бы подумал, что кто-то мог бы дать ответ сейчас, но, похоже, нет, так что давайте.
То, о чем вы мечтаете, - это то, о чем я сам мечтал: a boost::optional_array<T,N>
.
Существует два варианта:
- Первый: аналогично
boost::array< boost::optional<T>, N >
, то есть каждый элемент может быть или не быть установлен. - Второй: аналогично
std::vector<T>
(каким-то образом), то есть все начальные элементы заданы, а все последующие - нет.
Учитывая предыдущие вопросы / комментарии, кажется, что вы хотели бы второй, но это не такЭто действительно важно, так как оба довольно похожи.
template <typename T, size_t N>
class stack_vector
{
public:
bool empty() const { return mSize == 0; }
size_t size() const { return mSize; }
size_t capacity() const { return N; }
size_t max_size() const { return N; }
T& operator[](size_t i) { return *(this->pfront() + i); }
/// ...
private:
T* pfront() const { return reinterpret_cast<T*>(&mStorage); }
std::aligned_storage< N * sizeof(T), alignof(T) > mStorage;
size_t mSize; // indicate how many elements are set, from the beginning
};
Давайте сосредоточимся на этих очень специальных операциях:
template <typename T, size_t N>
void push_back(T const& t)
{
new (this->pfront() + mSize) T(t); // in place construction
++mSize;
}
template <typename T, size_t N>
void clear()
{
for (size_t i = 0; i != mSize; ++i)
{
(this->pfront() + i)->~T();
}
mSize = 0;
}
Как вы можете заметить, главная трудность заключается в том, чтобы запомнить, что:
- , если там еще не было построено ни одного элемента, вам нужно поместить конструкцию new + copy вместо присваивания.
- элементы, которые "устаревают" (т.е. будут после последнего элемента), должны бытьправильно утилизированы (т.е. их деструкторбыть вызван).
Существует много операций над традиционным контейнером STL, которые могут быть сложными для реализации.На vector
перетасовка элементов (из-за insert
или erase
) является, пожалуй, самым странным примером.
Также обратите внимание, что с C ++ 0x и initializer-lists vector
get emplace_back
непосредственное конструирование элемента на месте, что снимает требование CopyConstructible
, может быть хорошим благом в зависимости от вашего случая.