1. Куча / Говнокод #14466

    +127

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    Привет! 
    Сообщество, посмотри C++11 код, а не ошибочно ли выбраны символы для обжатия шаблонных параметров. 
    <сказка> 
    
    Итак, жили-были две функции: 
    
    void func0(bool=false); //ok
    void func1(bool=8>=8);  //ok
    
    И на лексемы разбирались они успешно и без конфликтов.
    
    И был у них друг помошник: 
    
    #define F(TYPE,NAME,VALUE)TYPE NAME=VALUE;
    F(int,value,0);
    #undef F
    
    Лексер и его на лексемы разбирал.
    
    Но пришли злые шаблоногородители и по нагородили шаблонов...
    
    Нагородили шаблонные структуры типа таких: 
    
    template<bool>struct a{constexpr a(bool){}};
    
    и переменные типа таких: 
    
    a<0> var=0;
    map<int,int> m;
    
    А лексер всё стоял и терпел. Он всё успешно на лексемы разбирал.
    
    Но радилась как-то в коде функция типа такой: 
    
    void func2(a<0>=8>=8); // fail
    
    И не выдержал лексер: 
    
    prog.cpp:4:18: warning: comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning [-Wparentheses]
     void func2(a<0>=8>=8); // fail
                      ^
    prog.cpp:4:12: error: parse error in template argument list
     void func2(a<0>=8>=8); // fail
                ^ 
    
    Не понял он что хотят от него. 
    
    void func2(a<0> = 8>=8 ); // это?
    void func2(a< 0>=8 > =8); // или это?
    
    ... да как же вам объяснить? 
    А давайте я заменю "<" на "{", а ">" на "}".
    
    И не понял лексер, что хотят от него. 
    
    void func2(a{0}=8>=8); // это?
    void func2(a{0>=8}=8); // или это?
    
    А потом уродилось в коде ещё и это: 
    
    #define F(TYPE,NAME,VALUE)TYPE NAME=VALUE;
    F(a<0>,var,0); //ok
    #undef F
    
    Но лексер терпел.
    
    Терпел, да не выдержал. 
    
    #define F(TYPE,NAME)TYPE NAME;
    F(map<int,int>,m); //fail
    #undef F
    
    Решил он забить на дело гиблое: 
    
    prog.cpp:7:17: error: macro "F" passed 3 arguments, but takes just 2
     F(map<int,int>,m); //fail
                     ^
    И ужёл он к другим стандартописателям. 
    </сказка> 
    tags: черновик, сказка, С++11, шаблоны, макросы, лексер

    Символы для обжатия параметров шаблонов выбраны ошибочно?

    Запостил: LispGovno, 02 Февраля 2014

    Комментарии (39) RSS

    • Тема повышенной сложности и важная.
      Ответить
    • > Символы для обжатия параметров шаблонов выбраны ошибочно?
      Да еще как... Вон до 11х крестов надо было писать > > вместо >>.

      > void func2(a{0}=8>=8); // это?
      > void func2(a{0>=8}=8); // или это?
      Или вообще чистую математику без шаблонов: ((a < 0) >= 8) >= 8
      Ответить
    • Кресты выбраны ошибочно.
      /thread
      Ответить
    • показать все, что скрытоДа и не могу я не въебать минус этому посту.
      Ответить
    • >>Сообщество, посмотри C++11 код

      Молодой человек, некультурно прилюдно показывать код на плюсах, тут дети могут быть
      Ответить
      • показать все, что скрытоВыпей спермы.
        Ответить
        • Ну вот, видишь ЛиспГовно, к чему это привело? Мальчик перевозбудился, щас будет бегать и дрочить на всех
          Ответить
        • Аватарка петушка? Нужно было коня или гоатсе.
          Ответить
          • Гоатсе нельзя, потому что сюда дети заходят. Вы бы ещё предложили второй за день код на крестах опубликовать!

            А если поставить коня, то поняшки обидятся.
            Ответить
        • Меня прикалывает кто-то открывает из спойлера сообщение питушка и дополнительно его минусует, не смотря на то, что уже хватит.
          Ответить
          • А ты как определил, что открывают?
            Ответить
            • БОЛЬШОЙ БРАТ следит за тобой
              Ответить
              • У вас в АНБ не хватает мощностей и они внедрили своего агента в гейдев?
                Ответить
          • По-моему его минусуют не открывая.

            Или Стертор расчехлил своих ботов.
            Ответить
          • Не буду говорить за остальных, но это скрипты.
            Ответить
    • Что это за магические числа?
      constexpr bool func_default_argument = 8 >= 8;
      //...
      void func2(a<0> = func_default_argument)

      Для передачи шаблонных конструкций в макрос используйте тайпдефы, можно локальные:
      void cococo()
      {
          using mapping_type = std::map<int,int>;
          F(mapping_type, m);
      }

      Странно что с такими проблемами вы вообще макросами отваживаетесь пользоваться. Тамже везде подводные грабли.
      Ответить
      • Макросы в крестах нинужны (*).
        (*) если ты не пилишь буст или подобную либу.
        Ответить
        • Фича ради фичи
          Ответить
          • Не, фича ради совместимости с сишкой. Ну и иногда все-таки нужны. Для написания извратных и сложных либ, а не для повседневного использования.
            Ответить
            • Ну это понятно - иногда такая гибкость нужна. Проблемы начинаются, когда разработчики выпучивают глаза, и начинают кричать - это же гениально, так нужно писать всегда! Серебряная пуля, серебряная пуля!
              Ответить
              • >>Серебряная пуля, серебряная пуля!
                Кол бы больше подошел.
                Ответить
        • Так, как они реализованы сейчас -- точно не нужны.
          Ответить

    Добавить комментарий