2017-02-14 8 views
1

Итак, я хочу написать контейнер для указателей, который скрывает тот факт, что это контейнер-указатель. И для моей функции AddMember это работает, вроде.Значение семантики в диапазоне, основанном на цикле контейнера-указателя

#include <iostream> 
#include <vector> 

template<typename T> 
class MyVector : public std::vector<T*> 
{ 
public: 
    void AddMember(T& newMember) 
    { 
     this->push_back(&newMember); 
    } 
}; 

int main() 
{ 
    int a, b; 
    MyVector<int> vec; 
    vec.AddMember(a); 
    vec.AddMember(b); 

    for (auto& member : vec) 
    { 
     std::cout << "Address:" << member << " Value: " << *member << std::endl; 
    } 

    return 0; 
} 

Теперь это можно реализовать предположительно begin() и end() таким образом, что диапазон на основе для цикла получает значение семантики? То есть только member дает вам значение? Я не хочу использовать контейнеры boost ptr, потому что это будет несобственный контейнер.

+1

Это похоже на проблему XY. Какую проблему вы действительно пытаетесь решить? – NathanOliver

+0

Я хочу обернуть контейнер указателя std, дать ему некоторые дополнительные функции и семантику значений. Часть, с которой я борюсь, я показал. Не знаете, что еще вам сказать. – Psirus

ответ

3

Теперь, возможно ли реализовать предположительно begin() и end() таким образом, чтобы цикл, основанный на диапазоне, получил семантику значения?

Да. Как и каждый другой контейнер, вам необходимо предоставить begin и end, которые возвращают итераторы.

Вы не можете использовать std::vector<T*>::iterator напрямую, потому что он имеет неправильный тип значения, но вы можете реализовать свой итератор поверх него. Этот тип итератора обертки называется адаптером итератора.

К счастью для вас, boost уже содержит библиотеку итераторных адаптеров, поэтому вам не нужно внедрять с нуля. Вы можете взглянуть, в частности, на boost::indirect_iterator.


PS. Избегайте публичного наследования стандартных контейнеров. У них нет виртуального деструктора, поэтому становится ошибочно писать программы, которые имеют неопределенное поведение.

Смежные вопросы