Re[3]: C++ идея для стандарта.
От: TimurSPB Интернет  
Дата: 02.03.18 13:58
Оценка:
pkl>Это несколько более жопно. Хочется в 1 строку встроенными средствами, не дописывая своих херен.
В python это есть из коробки.
Make flame.politics Great Again!
Re[4]: C++ идея для стандарта.
От: rean  
Дата: 02.03.18 13:59
Оценка:
deleted
Отредактировано 22.04.2019 9:17 deleted2 . Предыдущая версия .
Re[5]: C++ идея для стандарта.
От: uzhas Ниоткуда  
Дата: 02.03.18 14:08
Оценка:
Здравствуйте, rean, Вы писали:

R>Работает правильно.


Прочитай исходное сообщение внимательнее, чтобы понять как оно должно работать
Re: C++ идея для стандарта.
От: rg45 СССР  
Дата: 02.03.18 15:50
Оценка: 12 (2) +3
Здравствуйте, 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.

Но сейчас я хочу показать, как достаоточно просто эта задача решается средсдтвами самого языка, без использования всего перечисленного:

https://ideone.com/HkybcL

#include <functional>
#include <numeric>
#include <iostream>
#include <tuple>
#include <vector>

template <typename...T>
class ZipIterator
{
public:

   using reference = std::tuple<decltype(*std::declval<T>())...>;

public:

   ZipIterator(T&&...i) : m(std::forward<T>(i)...) { };

   reference operator * () const { return std::tie(*std::get<T>(m)...); }
   ZipIterator operator ++ () { char c[]{ (++std::get<T>(m), 0)... }; return *this; }

   bool operator == (const ZipIterator& other) const {
      const bool eq[]{ (std::get<T>(m) == std::get<T>(other.m))... };
      return std::accumulate(std::begin(eq), std::end(eq), false, std::logical_or<>());
   }
   bool operator != (const ZipIterator& other) const { return !(*this == other); }

private:
   std::tuple<T...> m;
};

template <typename T>
struct IteratorRange
{
   T m_begin;
   T m_end;

   const T& begin() const { return m_begin; }
   const T& end() const { return m_end; }
};

template <typename...T>
using ZipRange = IteratorRange<ZipIterator<decltype(std::begin(std::declval<T>()))...>>;

template <typename...T>
ZipRange<T...> make_zip_range(T&&...t) { return {{std::begin(t)...},{ std::end(t)...} }; }

int main()
{
   std::vector<int> a { 1, 2, 3 };
   std::vector<std::string> b { "hello", "world", "foo", "bar" };
   int c[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };

   for (auto&& entry : make_zip_range(a, b, c))
   {
      std::cout << std::get<0>(entry) << ", " << std::get<1>(entry) << ", " << std::get<2>(entry) << std::endl;
   }
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: C++ идея для стандарта.
От: night beast СССР  
Дата: 02.03.18 16:08
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>   for (auto&& entry : make_zip_range(a, b, c))
R>   {
R>      std::cout << std::get<0>(entry) << ", " << std::get<1>(entry) << ", " << std::get<2>(entry) << std::endl;
R>   }
R>}


когда структуре бандинг заработает, то наверно и без std::get будет можно.
Re[2]: C++ идея для стандарта.
От: Constructor  
Дата: 02.03.18 16:15
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Но сейчас я хочу показать, как достаоточно просто эта задача решается средсдтвами самого языка, без использования всего перечисленного:


R>https://ideone.com/HkybcL


Объект, возвращаемый make_zip_range, должен обеспечивать пролонгацию времени жизни временных объектов, переданных на вход make_zip_range, до момента завершения range-based for loop. Иначе может произойти страшное.
Re[3]: C++ идея для стандарта.
От: rg45 СССР  
Дата: 02.03.18 16:25
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Объект, возвращаемый make_zip_range, должен обеспечивать пролонгацию времени жизни временных объектов, переданных на вход make_zip_range, до момента завершения range-based for loop. Иначе может произойти страшное.


Ну это можно. Я открою страшную тайну: в этом эскизе это не единственный дефект
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: C++ идея для стандарта.
От: rean  
Дата: 02.03.18 16:33
Оценка: +2 -1 :)
deleted
Отредактировано 22.04.2019 9:17 deleted2 . Предыдущая версия .
Re[3]: C++ идея для стандарта.
От: rg45 СССР  
Дата: 02.03.18 16:57
Оценка: +3
Здравствуйте, rean, Вы писали:


R>Как раз вундерфалинг и получается: целых 29 строк нечитаемого птичьего языка с кучей особенного синтаксиса, typeinfo и большого количества сущностей.

R>Абсолютный антипаттерн во все времена — делаем охрененно сложно и жрущее процессор, только чтобы влепить что-то в неподходящий для этого оператор языка.
R>Жесть!

Ты так возмущаешься, как-будто я предлагаю этот код писать каждый раз. Во-первых, все что идет до строки №46 уже есть в boost, в каком-то виде. Не нравится boost — пожалуйста, написал один раз и пользуйся, сколько влезет. В этом случае от всего примера только функция main и остается. Основной моей мыслью было то, что не не нужно каждую школьную задачку встраивать в язык.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: C++ идея для стандарта.
От: Ops Россия  
Дата: 02.03.18 16:58
Оценка:
Здравствуйте, Nuzhny, Вы писали:

R>>А три итератора и использование обычного while цикла и трех проверок на end() уже не C++? Надо обязательно стандарт менять?


N>...или 1 индекс.


Индекс не всегда годится, в общем случае надо итераторы.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: C++ идея для стандарта.
От: rean  
Дата: 02.03.18 17:27
Оценка: :)
deleted
Отредактировано 22.04.2019 9:17 deleted2 . Предыдущая версия . Еще …
Отредактировано 02.03.2018 17:31 deleted2 . Предыдущая версия .
Re[5]: C++ идея для стандарта.
От: rg45 СССР  
Дата: 02.03.18 17:41
Оценка:
Здравствуйте, rean, Вы писали:

R>Да вообще не надо такое писать. Разве что ради стеба.


Этот пример, на самом деле состоит из двух частей. Первая часть — библиотечная — она пишется один раз, тестируется и спокойно лежит и ждет своего часа. Это как разумная альтернатива тому, чтоб встраивать такую возможность в язык, как это предлагает ТС. И когда она понадобится, мои программы будут получаться вот такими:

   for (auto&& entry : make_zip_range(a, b, c))
   {
      std::cout << std::get<0>(entry) << ", " << std::get<1>(entry) << ", " << std::get<2>(entry) << std::endl;
   }


а твои вот такими: http://rsdn.org/forum/cpp/7069883.1
Автор: rean
Дата: 02.03.18


    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 мегабайт в проект.


Спокойно компилируется, можешь проверить.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 02.03.2018 17:48 rg45 . Предыдущая версия . Еще …
Отредактировано 02.03.2018 17:42 rg45 . Предыдущая версия .
Re[6]: C++ идея для стандарта.
От: ezdoctor  
Дата: 02.03.18 18:25
Оценка: -1
Здравствуйте, uzhas, Вы писали:

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


R>>Работает правильно.


U>Прочитай исходное сообщение внимательнее, чтобы понять как оно должно работать


По-моему, этой фразой вы отвечаете на вопрос о том, стоит ли вносить такое изменение в стандарт. Если оно настолько интуитивно непонятно, что нужно читать спеку, то внесение этой фичи в стандарт весьма сомнительно.
Re: C++ идея для стандарта.
От: Constructor  
Дата: 02.03.18 19:41
Оценка: 27 (1)
Здравствуйте, 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>Можно ли это сделать уже щас без вундервафлинга?


Если размеры контейнеров одинаковы, то можно использовать boost::combine:

#include <boost/range/combine.hpp>

// ...

std::vector<int> vector{2, 3, 5};
const std::list<double> list{2.7, 3.14, 1.618};

std::cout << std::right << std::fixed << std::setprecision(3);
std::cout << "Zipped elements:" << std::endl;
for (const auto& elements_tuple : boost::combine(vector, list))
{
    int i;
    double r;
    
    boost::tie(i, r) = elements_tuple;
    std::cout << '(' << std::setw(1) << i << ',' << std::setw(6) << r  << ')' << std::endl;
}


Устранить многословность объявления переменных-элементов контейнера можно, дополнительно задействовав BOOST_FOREACH.
Re[3]: C++ идея для стандарта.
От: B0FEE664  
Дата: 02.03.18 23:15
Оценка: +1
Здравствуйте, rean, Вы писали:

pkl>>>Можно ли это сделать уже щас без вундервафлинга?

R>..
R>> using reference = std::tuple<decltype(*std::declval<T>())...>;

R>Как раз вундерфалинг и получается: целых 29 строк нечитаемого птичьего языка с кучей особенного синтаксиса, typeinfo и большого количества сущностей.

И где здесь typeinfo?
И каждый день — без права на ошибку...
Re[2]: C++ идея для стандарта.
От: Михaил  
Дата: 02.03.18 23:54
Оценка: +1 :))
Здравствуйте, rg45, Вы писали:

R>Это делается элементарно и смысла тащить это в стандарт лично я не вижу. Тут уже вспоминали про zip. Еще можно было бы вспомнить некоторые полезности из boost, такие как iterator_range, iterator_facade, iterator_adaptor.


R>Но сейчас я хочу показать, как достаоточно просто эта задача решается средсдтвами самого языка, без использования всего перечисленного:


Когда такое встречается в проекте, который достался в поддержку, и срочно необходимо что-то изменить, очень хочется найти этого любителя вые....ться, и популярно обьяснить ему принцип KISS
Re[3]: C++ идея для стандарта.
От: rg45 СССР  
Дата: 03.03.18 03:35
Оценка:
Здравствуйте, Михaил, Вы писали:

М>Когда такое встречается в проекте, который достался в поддержку, и срочно необходимо что-то изменить, очень хочется найти этого любителя вые....ться, и популярно обьяснить ему принцип KISS


А я где-то предлагал делать такое в проекте? Сколько раз нужно повторить любителям поумничать вот это
Автор: rg45
Дата: 02.03.18
и вот это
Автор: rg45
Дата: 02.03.18
?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 03.03.2018 8:18 rg45 . Предыдущая версия . Еще …
Отредактировано 03.03.2018 3:47 rg45 . Предыдущая версия .
Отредактировано 03.03.2018 3:43 rg45 . Предыдущая версия .
Re[4]: C++ идея для стандарта.
От: rean  
Дата: 03.03.18 04:15
Оценка: :)))
deleted
Отредактировано 22.04.2019 9:16 deleted2 . Предыдущая версия . Еще …
Отредактировано 04.03.2018 10:53 deleted2 . Предыдущая версия .
Re[5]: C++ идея для стандарта.
От: rg45 СССР  
Дата: 03.03.18 06:37
Оценка: +1
Здравствуйте, rean, Вы писали:

R>rg45, никто не умаляет ваши возможности писать шаблонный код. Они действительно впечатляют. Но все же существует промышленный C++, где люди не соревнуются в своем умении щеголять перед толпой, а создают программы, какие надо поддерживать и развивать. Я когда пришел сюда в форум, если често, просто офигел насколько все запущено с этим, судя по последним темам. А еще когда увидел эту тему про идею для стандарта, так совсем глаза на лоб полезли — потому что такие вот стремления людей к синтаксическому сахару все-же поддерживаются общим «безумием толпы». Придет кто-нибудь сюда и подумает, что C++ — это где-то в облаках, метапрограмирование, последние версии стандарта и прочие небесные технологии. А в реальности приходится возиться совсем с другими вещами.


Я удивляюсь, как тебе удается находить в моих сообщениях смысл, которого там нет, а потом еще и спорить по этому поводу. Еще раз, это был просто мой ответ на вопрос топикстартера: я выразил мнение, что не нужно встраивать в язык возможность, которую без труда можно реализовать в любой прикладной библиотеке. А мой пример — это всего лишь крошечный пруф того, что все это действительно легко делается встроенными средствами языка, даже без каких-либо внешних библиотек. Где ты там увидел, чтоб я предлагал использовать этот код в проекте, для меня остается загадкой
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: C++ идея для стандарта.
От: night beast СССР  
Дата: 03.03.18 07:28
Оценка: +1
Здравствуйте, rean, Вы писали:

R>Лично я понимаю интерес программистов к этим вещам. Все-же гребень технологий, и это уводит от рутины, да и просто интересно с точки зрения мужчины — покорять сложности и доказывать себе и другим что можешь. Но, увы, из ваших текстов складывается впечатление, что то что вы пишите — так и надо делать.


гребнем это было году эдак в 2001.
сейчас это просто средство для упрощения клиентского кода.
если кому то хочется писать на C++ с классами без RAII и прочего, то это не значит что всем остальным этого тоже достаточно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.