Текущий Стандарт С++ и перспективы его развития
    
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
| Страницы: (81) « Первая ... 70 71 [72] 73 74 ... 80 81 ( Перейти к последнему сообщению ) | 
    Текущий Стандарт С++ и перспективы его развития
    
  | 
         
         
         
          
           Сообщ.
           #1066
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Qraizer @  Я уж понял, спасибо.  Не что угодно, а символ, разрешённый к использованию в идентификаторах. Если это не так, то лексический разбор текста программы будет неуспешным.  | 
    
| 
         
         
         
          
           Сообщ.
           #1067
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
| 
         
         
         
           
            Сообщ.
            #1068
           
           , 
           
           Сообщение отклонено: JoeUser - 
         
         
	
       | 
    
| 
         
         
         
          
           Сообщ.
           #1069
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          На волнах ACCU 2016 щупаю новый стандарт C++ включая готовящиеся фишки из 17-го. Ну, что хочется сказать... Язык сильно, очень сильно докрутили. 
        
      Когда-то давно я писал статью про вариадик-шаблоны в С++. И приводил пример композитора. На 14-ом стандрате этот же пример становится сильно-сильно короче: ![]() ![]() 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) ...); } Проверял здесь. Можно оценить, насколько код становится проще...  | 
    
| 
         
         
         
          
           Сообщ.
           #1070
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Flex Ferrum @  вариадик-шаблоны в С++ Все ближе и ближе к D, синтаксис вот только все такой же неуклюжий.  | 
    
| 
         
         
         
          
           Сообщ.
           #1071
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата applegame @  Цитата Flex Ferrum @  вариадик-шаблоны в С++ Все ближе и ближе к D, синтаксис вот только все такой же неуклюжий. Да, эти нелепые !() уже не исправить...  | 
    
| 
         
         
         
          
           Сообщ.
           #1072
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          http://melpon.org/wandbox/permlink/seITYiZwrdPpLYas 
        
      Ну, ни GCC 6.1, ни из репозитория не компилирует, только шланг. Но, вообще, да: приходится использовать index_sequence и дополнительную функцию. И из-за особенностей вывода нельзя раскрыть в последовательность с использованием оператора <<     | 
    
| 
         
         
         
          
           Сообщ.
           #1073
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Flex Ferrum @  На 14-ом стандрате этот же пример становится сильно-сильно короче Только читается с трудом.  | 
    
| 
         
         
         
          
           Сообщ.
           #1074
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Угу. Чем дальше, тем больше метакод походит на декларативный стиль. В императивном языке это смотрится неуместно.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #1075
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата MyNameIsIgor @  Но, вообще, да: приходится использовать index_sequence и дополнительную функцию. И из-за особенностей вывода нельзя раскрыть в последовательность с использованием оператора <<  Да легко: ![]() ![]() #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  | 
    
| 
         
         
         
          
           Сообщ.
           #1076
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Flex Ferrum @  Да легко Приведённый код и код по ссылке разные. Так что я не понял: что легко то? Добавлено Я знаю, что можно раскрывать через operator ... operator, но в приведённом мной примере это не получится из-за противоречий в интерфейсе вывода в стандартные потоки и правил раскрытия выражения. Понятно, что эти правила придуманы так, чтобы не получить просто текстовую подстановку а-ля макросы, но вот с чем-то вроде потоков придётся выкручиваться.  | 
    
| 
         
         
         
          
           Сообщ.
           #1077
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          MyNameIsIgor, твой и мой код эквивалентны. В смысле, приводят к одному результату. Мой при этом несколько проще.  
        
      Добавлено Хотя, да. Вижу, чем отличаются.  | 
    
| 
         
         
         
          
           Сообщ.
           #1078
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Немного новостей: 
        
      https://habrahabr.ru/company/yandex/blog/30...ntent=link2post Фишки весьма вкусные, я бы сказал.  | 
    
| 
         
         
         
          
           Сообщ.
           #1079
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата Flex Ferrum @  Немного новостей: Что понимается под Цитата  ?  гарантированный copy elision;  | 
    
| 
         
         
         
          
           Сообщ.
           #1080
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          И никаких мультиметодов... Придётся вернуться в начало десятилетия и допилить.   
        
       |