Здравствуйте, pkl, Вы писали:
pkl>Есть 3 контейнера: a, b, c. Хочу запустить 1 range-цикл по ним всем одновременно:
pkl>
pkl>for( auto i1 : a, auto i2 : b, auto i3 : c) {
pkl>}
pkl>
pkl>На каждой итерации i1, i2, i3 имеет очередное значение из соответствующего контейнера. pkl>Цикл помирает как только исчерпается самый мелкий контейнер. pkl>Жопа ли это? Я тупой наркоман? Можно ли это сделать уже щас без вундервафлинга?
Это делается элементарно и смысла тащить это в стандарт лично я не вижу. Тут уже вспоминали про zip. Еще можно было бы вспомнить некоторые полезности из boost, такие как iterator_range, iterator_facade, iterator_adaptor.
Но сейчас я хочу показать, как достаоточно просто эта задача решается средсдтвами самого языка, без использования всего перечисленного:
Здравствуйте, rg45, Вы писали:
R>Но сейчас я хочу показать, как достаоточно просто эта задача решается средсдтвами самого языка, без использования всего перечисленного:
R>https://ideone.com/HkybcL
Объект, возвращаемый make_zip_range, должен обеспечивать пролонгацию времени жизни временных объектов, переданных на вход make_zip_range, до момента завершения range-based for loop. Иначе может произойти страшное.
Здравствуйте, Constructor, Вы писали:
C>Объект, возвращаемый make_zip_range, должен обеспечивать пролонгацию времени жизни временных объектов, переданных на вход make_zip_range, до момента завершения range-based for loop. Иначе может произойти страшное.
Ну это можно. Я открою страшную тайну: в этом эскизе это не единственный дефект
--
Не можешь достичь желаемого — пожелай достигнутого.
R>Как раз вундерфалинг и получается: целых 29 строк нечитаемого птичьего языка с кучей особенного синтаксиса, typeinfo и большого количества сущностей. R>Абсолютный антипаттерн во все времена — делаем охрененно сложно и жрущее процессор, только чтобы влепить что-то в неподходящий для этого оператор языка. R>Жесть!
Ты так возмущаешься, как-будто я предлагаю этот код писать каждый раз. Во-первых, все что идет до строки №46 уже есть в boost, в каком-то виде. Не нравится boost — пожалуйста, написал один раз и пользуйся, сколько влезет. В этом случае от всего примера только функция main и остается. Основной моей мыслью было то, что не не нужно каждую школьную задачку встраивать в язык.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Nuzhny, Вы писали:
R>>А три итератора и использование обычного while цикла и трех проверок на end() уже не C++? Надо обязательно стандарт менять?
N>...или 1 индекс.
Индекс не всегда годится, в общем случае надо итераторы.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, rean, Вы писали:
R>Да вообще не надо такое писать. Разве что ради стеба.
Этот пример, на самом деле состоит из двух частей. Первая часть — библиотечная — она пишется один раз, тестируется и спокойно лежит и ждет своего часа. Это как разумная альтернатива тому, чтоб встраивать такую возможность в язык, как это предлагает ТС. И когда она понадобится, мои программы будут получаться вот такими:
auto ia = a.begin();
auto ib = b.begin();
auto ic = c.begin();
for (;;) {
bool in_a = ia != a.end();
bool in_b = ib != b.end();
bool in_c = ic != c.end();
if (!(in_a || in_b || in_c)) break;
if (in_a)
std::cout << *ia;
else
std::cout << "-";
if (in_b)
std::cout << ", " << (*ib).c_str();
else
std::cout << ", -";
if (in_c)
std::cout << ", " << *ic;
else
std::cout << ", -";
std::cout << std::endl;
if (in_a) ++ia;
if (in_b) ++ib;
if (in_c) ++ic;
};
Если тебе твоя программа нравится больше, пожалуйста, я тебе ничего не навязываю. Мне же, извини, это напоминает рецепт какого-то борща.
R>Оно скорей всего у меня даже не откомпилируется на VC++, а boost так это еще + 300 мегабайт в проект.
Спокойно компилируется, можешь проверить.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, rean, Вы писали:
R>>Работает правильно.
U>Прочитай исходное сообщение внимательнее, чтобы понять как оно должно работать
По-моему, этой фразой вы отвечаете на вопрос о том, стоит ли вносить такое изменение в стандарт. Если оно настолько интуитивно непонятно, что нужно читать спеку, то внесение этой фичи в стандарт весьма сомнительно.
Здравствуйте, rean, Вы писали:
pkl>>>Можно ли это сделать уже щас без вундервафлинга? R>.. R>> using reference = std::tuple<decltype(*std::declval<T>())...>;
R>Как раз вундерфалинг и получается: целых 29 строк нечитаемого птичьего языка с кучей особенного синтаксиса, typeinfo и большого количества сущностей.
И где здесь typeinfo?
Здравствуйте, rg45, Вы писали:
R>Это делается элементарно и смысла тащить это в стандарт лично я не вижу. Тут уже вспоминали про zip. Еще можно было бы вспомнить некоторые полезности из boost, такие как iterator_range, iterator_facade, iterator_adaptor.
R>Но сейчас я хочу показать, как достаоточно просто эта задача решается средсдтвами самого языка, без использования всего перечисленного:
Когда такое встречается в проекте, который достался в поддержку, и срочно необходимо что-то изменить, очень хочется найти этого любителя вые....ться, и популярно обьяснить ему принцип KISS
Здравствуйте, Михaил, Вы писали:
М>Когда такое встречается в проекте, который достался в поддержку, и срочно необходимо что-то изменить, очень хочется найти этого любителя вые....ться, и популярно обьяснить ему принцип KISS
А я где-то предлагал делать такое в проекте? Сколько раз нужно повторить любителям поумничать вот это
Здравствуйте, rean, Вы писали:
R>rg45, никто не умаляет ваши возможности писать шаблонный код. Они действительно впечатляют. Но все же существует промышленный C++, где люди не соревнуются в своем умении щеголять перед толпой, а создают программы, какие надо поддерживать и развивать. Я когда пришел сюда в форум, если често, просто офигел насколько все запущено с этим, судя по последним темам. А еще когда увидел эту тему про идею для стандарта, так совсем глаза на лоб полезли — потому что такие вот стремления людей к синтаксическому сахару все-же поддерживаются общим «безумием толпы». Придет кто-нибудь сюда и подумает, что C++ — это где-то в облаках, метапрограмирование, последние версии стандарта и прочие небесные технологии. А в реальности приходится возиться совсем с другими вещами.
Я удивляюсь, как тебе удается находить в моих сообщениях смысл, которого там нет, а потом еще и спорить по этому поводу. Еще раз, это был просто мой ответ на вопрос топикстартера: я выразил мнение, что не нужно встраивать в язык возможность, которую без труда можно реализовать в любой прикладной библиотеке. А мой пример — это всего лишь крошечный пруф того, что все это действительно легко делается встроенными средствами языка, даже без каких-либо внешних библиотек. Где ты там увидел, чтоб я предлагал использовать этот код в проекте, для меня остается загадкой
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rean, Вы писали:
R>Лично я понимаю интерес программистов к этим вещам. Все-же гребень технологий, и это уводит от рутины, да и просто интересно с точки зрения мужчины — покорять сложности и доказывать себе и другим что можешь. Но, увы, из ваших текстов складывается впечатление, что то что вы пишите — так и надо делать.
гребнем это было году эдак в 2001.
сейчас это просто средство для упрощения клиентского кода.
если кому то хочется писать на C++ с классами без RAII и прочего, то это не значит что всем остальным этого тоже достаточно.