Получить тип контейнера из (его) типа итератора в C ++ (STL) - PullRequest
19 голосов
/ 10 июня 2010

Контейнеру легко получить связанные итераторы, пример:

std::vector<double>::iterator i; //An iterator to a std::vector<double>

Мне было интересно, возможно ли, учитывая тип итератора, определить тип «соответствующего контейнера» (здесь я предполагаю, что для каждого контейнера существует один-единственный (неконстантный) итератор). 1004 *

Точнее, я хотел бы, чтобы метафункция шаблона работала со всеми контейнерами STL (без необходимости специализировать его вручную для каждого отдельного контейнера), например:

ContainerOf< std::vector<double>::iterator >::type 

оценивается как

std::vector<double>

Возможно ли это? Если нет, то почему?

Заранее благодарю за любую помощь!

Ответы [ 4 ]

8 голосов
/ 10 июня 2010

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

6 голосов
/ 10 июня 2010

Просто для удовольствия, вот что я быстро взломал с помощью Boost.MPL (предупреждение: это было очень поверхностно проверено, так что обращайтесь с осторожностью):

0 голосов
/ 10 июня 2010

Смысл итераторов в том, что вы используете их для выполнения работы без необходимости знать базовый тип контейнера, например, для передачи пары начало / конец и выполнения работы в этом диапазоне.

Однако, если все вызабота о типе итератора, я полагаю, что вы можете использовать черты итератора, чтобы определить, например, является ли итератор произвольным доступом.Возьмем std::advance, в общем случае он вызывает operator++ для итератора n раз, но специализируется для использования итераторами произвольного доступа + =.

Кроме того, я не знаю ни о какихспособ получить тип контейнера из итератора.

0 голосов
/ 10 июня 2010

Точные типы времени выполнения итераторов C ++ STL намеренно не определены и поэтому зависят от реализации.Вы можете выполнить поиск по заголовочным файлам вашего поставщика компилятора, чтобы выяснить, какой тип фактически используется, и определить контейнер из этого, но он зависит от поставщика и версии, поэтому может быть взломан.

...