Кортежи C ++ 0x не имеют итераторов, верно? - PullRequest
5 голосов
/ 31 июля 2011

Глядя на стандарт N3291, я не нахожу никаких ссылок на tuple для поддержки begin() и end().Но когда я смотрю на свои записи, сделанные много лет назад, я, кажется, записал, что мне нужно изучить это позже.И вот мы здесь.

Я не могу найти никаких следов tuple<...>.begin() или tuple<...>.end() в текущем стандарте C ++ 0x, это правильно?Невозможно передать кортеж с его итераторами в алгоритм, равно как и один for -попад по нему, верно?

tuple<int,string,double> val;
for(auto a : val) cerr << val;     // very wrong!

, что, конечно, глупость, потому что то, что должно быть auto?

Мне нужно подтверждение, что мои заметки содержат ошибку, и что нет способа получить эти итераторы для элементов кортежа.Или, может быть, в обсуждении стандартов был заброшенный путь?

Примечание: я знаю, что можно использовать TMP или шаблонов Variadic для реализации do-for-all-elements-of-a-tuple , но мой вопрос действительно об итераторах.

Ответы [ 3 ]

7 голосов
/ 01 августа 2011

Boost . Fusion имеет итеративные кортежи - boost::fusion::vector<> - наряду со многими алгоритмами итерации, запроса и преобразования для кортежей.

Он также имеет код для адаптации boost::tuple<> для использования с этими итераторами и алгоритмами ;Вы можете взять этот код и изменить его для работы с std::tuple<>.

3 голосов
/ 31 июля 2011

Итераторы для кортежей были бы так же полезны, как итераторы для членов класса. Кортежи просто не должны иметь такого итеративного контента.

1 голос
/ 31 июля 2011

Нет, для кортежей нет итераторов. Итераторы - это концепция времени выполнения, а кортежи - это конструкция времени компиляции. Как вы правильно заметили, нет даже способа осмыслить универсальный итератор кортежей.

Если вам нужен контейнер времени стирания типа, вы можете использовать вектор boost::any s.

...