На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (77) « Первая ... 70 71 [72] 73 74 ...  76 77  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Цитата Qraizer @
    Не что угодно, а символ, разрешённый к использованию в идентификаторах. Если это не так, то лексический разбор текста программы будет неуспешным.
    Я уж понял, спасибо.
      Цитата MyNameIsIgor @
      Но я всё ещё не могу остановить компиляцию, если спецификатор в формате не совпадает с выводимым типом!

      Оказывается, могу! Только степень понятности такой остановки оставляет желать лучшего.

      Сообщения были разделены в тему "Spam"
          На волнах ACCU 2016 щупаю новый стандарт C++ включая готовящиеся фишки из 17-го. Ну, что хочется сказать... Язык сильно, очень сильно докрутили.
          Когда-то давно я писал статью про вариадик-шаблоны в С++. И приводил пример композитора. На 14-ом стандрате этот же пример становится сильно-сильно короче:

          ExpandedWrap disabled
            template<typename Op, typename ... FNs>
            struct Composer
            {
            public:
                template<typename O, typename ... Fs>
                Composer(O &&op, Fs&& ... fns)
                    : m_op(std::forward<O>(op))
                    , m_fns(std::make_tuple(std::forward<Fs>(fns)...))
                {
                }
                
                template<typename ... Args>
                auto operator ()(Args&& ... args)
                {
                    return InvokeComposer(std::forward_as_tuple(std::forward<Args>(args)...), std::index_sequence_for<FNs ...>(), std::index_sequence_for<Args ...>());
                }
                
            private:
                template<typename Args, size_t ... FnIdxs, size_t ... ArgIdxs>
                auto InvokeComposer(Args &&args, std::index_sequence<FnIdxs...>, std::index_sequence<ArgIdxs ...>)
                {
                    return m_op(Apply<ArgIdxs ...>(std::get<FnIdxs>(m_fns), std::move(args))...);
                }
                                    
                template<size_t ... ArgIdxs, typename Fn, typename Args>
                auto Apply(Fn fn, Args &&args)
                {
                    return fn(std::get<ArgIdxs>(std::forward<Args>(args))...);
                }
                
                Op m_op;
                std::tuple<FNs...> m_fns;
            };
             
             
            template<typename Op, typename ... FNs>
            auto MakeComposer(Op &&op, FNs&& ... fns)
            {
                return Composer<std::decay_t<Op>, std::decay_t<FNs>...>(std::forward<Op>(op), std::forward<FNs>(fns) ...);
            }


          Проверял здесь.

          Можно оценить, насколько код становится проще...
          Сообщение отредактировано: Flex Ferrum -
            Цитата Flex Ferrum @
            вариадик-шаблоны в С++

            Все ближе и ближе к D, синтаксис вот только все такой же неуклюжий.
              Цитата applegame @
              Цитата Flex Ferrum @
              вариадик-шаблоны в С++

              Все ближе и ближе к D, синтаксис вот только все такой же неуклюжий.

              Да, эти нелепые !() уже не исправить...
                http://melpon.org/wandbox/permlink/seITYiZwrdPpLYas
                Ну, ни GCC 6.1, ни из репозитория не компилирует, только шланг.
                Но, вообще, да: приходится использовать index_sequence и дополнительную функцию. И из-за особенностей вывода нельзя раскрыть в последовательность с использованием оператора << <_<
                  Цитата Flex Ferrum @
                  На 14-ом стандрате этот же пример становится сильно-сильно короче

                  Только читается с трудом.
                    Угу. Чем дальше, тем больше метакод походит на декларативный стиль. В императивном языке это смотрится неуместно.
                      Цитата MyNameIsIgor @
                      Но, вообще, да: приходится использовать index_sequence и дополнительную функцию. И из-за особенностей вывода нельзя раскрыть в последовательность с использованием оператора <<

                      Да легко:
                      ExpandedWrap disabled
                        #include <iostream>
                         
                        template<typename Head, typename ... Args>
                        void print(Head h, Args ... args)
                        {
                            std::cout << h;
                            (..., (std::cout << ", " << args));
                        }
                         
                        int main()
                        {
                            print('H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n');
                        }

                      http://rextester.com/NCZCV64695
                        Цитата Flex Ferrum @
                        Да легко

                        Приведённый код и код по ссылке разные. Так что я не понял: что легко то?

                        Добавлено
                        Я знаю, что можно раскрывать через operator ... operator, но в приведённом мной примере это не получится из-за противоречий в интерфейсе вывода в стандартные потоки и правил раскрытия выражения. Понятно, что эти правила придуманы так, чтобы не получить просто текстовую подстановку а-ля макросы, но вот с чем-то вроде потоков придётся выкручиваться.
                          MyNameIsIgor, твой и мой код эквивалентны. В смысле, приводят к одному результату. Мой при этом несколько проще.

                          Добавлено
                          Хотя, да. Вижу, чем отличаются.
                            Немного новостей:
                            https://habrahabr.ru/company/yandex/blog/30...ntent=link2post

                            Фишки весьма вкусные, я бы сказал.
                              Цитата Flex Ferrum @
                              Немного новостей:

                              Что понимается под
                              Цитата
                              гарантированный copy elision;
                              ?
                                И никаких мультиметодов... Придётся вернуться в начало десятилетия и допилить.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (77) « Первая ... 70 71 [72] 73 74 ...  76 77


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0942 ]   [ 17 queries used ]   [ Generated: 29.03.24, 02:09 GMT ]