Доступ к элементам контейнеров различного типа
От: oilmagnate  
Дата: 05.09.06 07:31
Оценка:
Проблема такая: существует std::map в котором first — это некоторый id, а second содержит итератор на несовместимые контейнеры, т.е. например, структура с id == 0: это некий самопальный stl-совместимй чудо-контейнер, а вторая, имеющая id == 1 — это std::list

Теперь вопрос: как реализовать такое, и добраться до объекта, на который ссылаются?

Варианты до которых додумался я — это

1. использовать boost::any

std::map<int, boost::any> ref;
    
    std::list<int> l;
    l.push_back(7);
    ref[0] = std::find(l.begin(), l.end(), 7);
    
    std::vector<int> v;
    v.push_back(6);
    ref[1] = std::find(v.begin(), v.end(), 6);
    
      boost::any val = ref[1];
    std::cout << *boost::any_cast<std::vector<int>::iterator>(val);


но как тогда зная typeid приводить any к нужному типу?

2.

Только по рукам сильно не бейте...

    class a {
    public:
         a() {};
    };

    template <class iterator> 
    class b : public a {
    private:
         iterator it;
    public:
         b(iterator _it) : it(_it) {};
         iterator get() { return it; };
    };


тогда

     std::map<int, a*>  m;
     m[0] = new b<std::vector<int>::iterator>(i);


Может можно проще, красивей?
Re: Доступ к элементам контейнеров различного типа
От: korzhik Россия  
Дата: 05.09.06 08:18
Оценка:
Здравствуйте, oilmagnate, Вы писали:

O>Проблема такая: существует std::map в котором first — это некоторый id, а second содержит итератор на несовместимые контейнеры, т.е. например, структура с id == 0: это некий самопальный stl-совместимй чудо-контейнер, а вторая, имеющая id == 1 — это std::list


O>Теперь вопрос: как реализовать такое, и добраться до объекта, на который ссылаются?


может RSDN search: any_iterator ?
Re[2]: Доступ к элементам контейнеров различного типа
От: oilmagnate  
Дата: 05.09.06 13:03
Оценка:
K>может RSDN search: any_iterator ?

Очень даже может быть...а можно на примере стандартного вектора и списка? Не судите строго, но я не понял как этим воспользоваться.

    typedef std::list<std::string>::iterator LI;
    typedef std::vector<int>::iterator VI;

    std::<int, any_iterator<???> > m;
    m[0] = ???;


спасибо.

зы
и всё-таки...чем хуже boost::any?
Re[3]: Доступ к элементам контейнеров различного типа
От: korzhik Россия  
Дата: 05.09.06 14:24
Оценка:
Здравствуйте, oilmagnate, Вы писали:

K>>может RSDN search: any_iterator ?


O>Очень даже может быть...а можно на примере стандартного вектора и списка? Не судите строго, но я не понял как этим воспользоваться.


//-----------------------------------------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <cassert>
//-----------------------------------------------------------------------------
#include "./mtn/any_iterator.h"
//-----------------------------------------------------------------------------
int main()
{
    typedef int                                     value_type;
    typedef std::vector<value_type>                 first_storage_type;
    typedef std::list<value_type>                   second_storage_type;
    typedef mtn::any_iterator<value_type>           polymorth_iterator_type;
    typedef std::map<int, polymorth_iterator_type>  dictionary_type;

    first_storage_type  st1;
    second_storage_type st2;
    dictionary_type     dict;

    st1.push_back(1);
    st2.push_back(2);

    dict.insert(dictionary_type::value_type(0, polymorth_iterator_type(st1.begin())));
    dict.insert(dictionary_type::value_type(1, polymorth_iterator_type(st2.begin())));

    assert(1 == *(dict[0]));
    assert(2 == *(dict[1]));
}


O>зы

O>и всё-таки...чем хуже boost::any?

boost::any для значений, а any_iterator для итераторов, хотя принцип работы у них одинаковый.
Re[2]: Доступ к элементам контейнеров различного типа
От: korzhik Россия  
Дата: 05.09.06 14:31
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, oilmagnate, Вы писали:


O>>Проблема такая: существует std::map в котором first — это некоторый id, а second содержит итератор на несовместимые контейнеры, т.е. например, структура с id == 0: это некий самопальный stl-совместимй чудо-контейнер, а вторая, имеющая id == 1 — это std::list


O>>Теперь вопрос: как реализовать такое, и добраться до объекта, на который ссылаются?


K>может RSDN search: any_iterator ?


Кстати никто не в курсе почему никак не включат any_iterator в boost?
Re[2]: Доступ к элементам контейнеров различного типа
От: korzhik Россия  
Дата: 05.09.06 14:35
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, oilmagnate, Вы писали:


O>>Проблема такая: существует std::map в котором first — это некоторый id, а second содержит итератор на несовместимые контейнеры, т.е. например, структура с id == 0: это некий самопальный stl-совместимй чудо-контейнер, а вторая, имеющая id == 1 — это std::list


O>>Теперь вопрос: как реализовать такое, и добраться до объекта, на который ссылаются?


K>может RSDN search: any_iterator ?


Можно ещё посмотреть adobe::any_iterator
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.