1. C++ / Говнокод #12449

    +8

    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
    #include <iostream>
     
    struct Reader_msg;
    template<class T>struct TMsg;
     
    struct IMsg
    {
        virtual ~IMsg(){}
        virtual void SendCast(Reader_msg& obj) = 0;
    };
     
    struct Some{}; 
     
    struct Reader_msg
    {
        template<class T> void ReadMsg(T& msg)
        {
            //Здесь можно приляпать статик_ассерт
            std::cout<<"ERROR UNKNOW TYPE \n";
        }
        void ReadMsg(int msg)   { (void)msg; std::cout<<"TYPE IS INT\n";   }
        void ReadMsg(float msg) { (void)msg; std::cout<<"TYPE IS FLOAT\n"; }
        void ReadMsg(Some msg)  { (void)msg; std::cout<<"TYPE IS SOME\n";  }
     
        template<class T>void TakeMsg(T& msg) { msg.SendCast(*this); }
    };
     
    template<class T>struct TMsg:IMsg
    {
        T data;
        void SendCast(Reader_msg& obj){ obj.ReadMsg(data); }
    };
     
     
    int main()
    {
        Reader_msg reader;
        TMsg<int>    msg1;
        TMsg<float>  msg2;
        IMsg& msg3 = msg1;
        IMsg& msg4 = msg2;
        TMsg<Some>   msg5;
        TMsg<double> msg6;
        
     
        reader.TakeMsg(msg1);
        reader.TakeMsg(msg2);
        reader.TakeMsg(msg3);
        reader.TakeMsg(msg4);
        reader.TakeMsg(msg5);
        reader.TakeMsg(msg6);
    }

    http://liveworkspace.org/code/4FHDTq$6

    Запостил: LispGovno, 18 Января 2013

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

    • Тфу. Хуйню запостил. Минусуйте.
      Ответить
      • Назло поплюсую.
        И говно найду... Например, почему main ничего не возвращает?!
        Ответить
        • Продолжу список:
          1. "\n" вместо endl выглядит просто ужасно.
          2. (void)msg; похоже на говно. Я понимаю, что это для того, чтобы компилятор не ругался на неиспользуемый параметр. Но это же костыль!
          3. Не указан тип параметров main.
          Ответить
          • > 1. "\n" вместо endl выглядит просто ужасно.

            endl форсирует flush - "\n" нет. мы тут типа производительность оптимизируем для случая если программа выводит на тормозной терминал :)

            > 3. Не указан тип параметров main.

            есть 3(?) валидных прототипа main предусмотреных стандартом:
            int main(); // int main(void)
            int main(int argc, char **argv);
            int main(int argc, char **argv, char **envp);
            Ответить
            • Емнип даже джва, а третий с окружением уже не описан в стандарте.
              Ответить
              • envp тоже первый раз вижу. Это gccблядство?
                Ответить
                • Не совсем, оно вроде бы и до gcc существовало, просто в стандарты С и POSIX не попало.
                  Ответить
              • Третий вариант не стандартизирован в POSIX, хотя исторически практически все версии Unix его поддерживают. Даже виндусовый компилятор может в такую сигнатуру
                http://msdn.microsoft.com/en-us/library/6wd819wh.aspx
                Ответить
          • > (void)msg; похоже на говно
            void ReadMsg(int /*msg*/) тоже. А из двух говн выбирают по вкусу.

            P.S. void ReadMsg(int) еще большее говно, т.к. тут теряется имя переменной, и если оно понадобится - его нужно будет искать в доке\предке. К тому же так нельзя в Си.
            Ответить
        • > Например, почему main ничего не возвращает?!

          это прикол который меня в свое время заставил долго гуглить. фишка: в оригинальном С, если в main отсутствовал в конце return, то возвращался автоматом ноль. (то же самое если main был объявлен void.) если правильно помню, в стандартизированом С (в ANSI C/C89) main должен был чего-то возвращать. другими словами: main перестал быть специальным, и стал просто функцией.
          Ответить
          • main — просто функция, которая... вызывается неким куском кода из runtime-библиотеки, на который указывает точка входа в исполнимый файл. Этот самый кусок кода, вызывающий main, может ожидать, что она что-то вернёт, чтобы запихнуть это значение в код возврата приложения.
            Ответить
            • Ага, в сишке (mingw):
              call  _main
              mov    %eax,%ebx
              call __cexit
              mov    %ebx,(%esp)
              call _ExitProcess@4
              Ответить
            • еще раз: в оригинальном С, до ISO/ANSI стандартизации, main была специальной функцией.

              мне в свое время пришлось перепахать кучи пре-ANSI C кода. фишка с main была как раз тем местом которое сломалось на новых компиляторах (даже на том который клялся что поддерживает pre-ANSI 100% (хотя как можно поддерживать 100% нечто нестандартизированое?)). это было очень очевидно, потому что тест-кэйсы рандомно обламывались. и обламывались они потому что ни в одном main'е не стояло return'а. поэтому то мне и пришлось тогда это дело гуглить и ковырять и фиксить.
              Ответить
              • Самое забавное - ub это только в с89, в дальнейших стандартах написали что майн без ретурна возвращает 0...

                А вот если в гцц врубить совместимость с с89 и не написать ретурн, то он действительноиначинает возвращать всякую херню.

                P.s. лучше бы они ошибку компиляци выдавали, чем херню или ноль возвращать... исправить ее было бы намного проще, чем думать о том почему мусор в коде возврата.
                Ответить
                • В c89 он вовращает return rand(); специально, чтобы учить долбоебов.

                  Ну и в режиме с89 никто в здравом уме компилировать не будет, а только если встретит с89 программу, поэтому ошибку кидать нельзя, а то пол генту несоберется при сборке пакаджей.
                  Ответить
                  • [u]LispGovno[u] только что #
                    Ответить
                  • Ну там не rand() он просто генерит ret без установки результата, вот и возвращается что-то, что лежало там. (Обычно вроде бы результат выполнения последней функции, но т.к. UB ничего точнее сказать нельзя).
                    Ответить
                    • LispGovno now #
                      > Ну там не rand()
                      http://feross.org/gcc-ownage/
                      Ответить
                      • GListGovno только что #
                        Теперь ты анон знаешь как в пару строчек на крестах написать игру. Такой лаконичности нет даже в хаскеле.
                        Ответить
                  • > поэтому ошибку кидать нельзя
                    Ломаешь совместимость - так ломай ее полностью явно. Имхо ошибка при компиляции намного лучше, чем неведомая хуита в рантайме.

                    Dummy00001: это прикол который меня в свое время заставил долго гуглить.
                    А вот если была бы выдана корректная ошибка - ему пришлось бы гуглить и тратить время.
                    Ответить
        • LispGovno только что #
          > Назло поплюсую.
          > И говно найду...
          Свинья везде говна найдет.
          Ответить
    • школота учит темплейты?
      Ответить
    • Где специализация TMsg для void?
      Ответить
      • http://ideone.com/HTs7GX
        Да ёбаное крестоблядство! Даже мой любимый способ игнорирования ненужных аргументов забаговали ;( Злые вы все, уйду я от вас к жабе или шарпику.
        Ответить
        • в смысле http://ideone.com/BfHxPT ?
          Ответить
          • Да, именно так там было написано до тех пор пока я не ткнул в кнопку "редактировать".

            Я никогда не буду редактировать уже запощенные на ГК коды.
            Я никогда не буду редактировать уже запощенные на ГК коды.
            Я никогда не буду редактировать уже запощенные на ГК коды.

            UPD: Вернул (void)t на место.
            Ответить
            • #include <iostream>
               
              class Test {
              public:
                  operator void () {
                      std::cout << "cast to void!" << std::endl;
                  }
              };
               
              void test(Test t) {
                  (void)t;
              }
               
              int main() {
                  Test t;
                  test(t);
                  return 0;
              }
              Наркоман штоле?
              Ответить
      • > Где специализация TMsg для void?
        И что по твоему она должна делать?
        Ответить
        • Ничего! :D
          Ответить
        • Например, в паттерне Observer - уведомлять наблюдателей об изменении состояния наблюдаемого.
          Ответить
    • Пашка наклонился ко мне, мы молча смотрели друг другу в глаза, он поцеловал меня и прошептал:
      Ответить

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