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

    +157

    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
    struct Event
    {
       int priority;
       bool operator<(Event e) const
       {
          return e.priority>priority;
       }
       
       virtual void operator() () = 0;
    };
    
    priority_queue<Event*, deque<Event*> > eventQueue;
    
    template <typename T, void (T::*g)()>
    struct  TEvent : Event
    { 
       T* parent;
       virtual void operator() () 
       {
          (parent->*g)();
       }
       TEvent (T* _parent) : parent(_parent){}
    };
    
    struct Entity
    {
       int foo;
       void AFunc() 
       {
          cout<<foo;
       }
    
       void BFunc() 
       {
          cout<<"Ololo";
       }
               
       typedef TEvent<Entity,&Entity::AFunc> someEvent;
       Entity(int _foo): foo(_foo){}
             
       void addEvent()
       {
          eventQueue.push(new someEvent(this));
       }
    };
    
    int main()
    {
       Entity foo(10);
       foo.addEvent();
       (*eventQueue.top())();
       return 0;
    }

    Один из самых сложных и неочевидных способов вывести в консоль число 10.
    (Этот код - проверка, будет ли работать прототип велосипедного делегата)

    Запостил: CHayT, 15 Февраля 2011

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

    • P.S. Впоследствии это вытекло в http://govnokod.ru/5536
      Ответить
      • какой компилер?

        параметризировать темлейт поинтером "typedef TEvent<Entity,&Entity::AFunc> someEvent;" вроде бы как нельзя (т.к. поинтер резолвится в рантайме, а темплейты генерятся компилером).

        или?
        Ответить
        • msvc.
          typedef TEvent<Entity,&Entity::AFunc> - явно ресолвится в компайлтайме. Он компайлтайм ссылки спокойно кушает в качестве аргументов шаблона. Так можно даже float в шаблон передать. Но код получается непереносимый.
          Ответить
    • "Ololo"
      Ответить
    • Ответить
    • Где говно? Ткните носом.
      Обычный "код - проверка".
      Ответить
    • > bool operator<(Event e) const
      error: cannot declare parameter ‘e’ to be of abstract type ‘Event’
      note: because the following virtual functions are pure within ‘Event’: virtual void Event::operator()()
      Ответить
    • bool operator<(Event e) const

      Не понял, а где вторая угловая скобочка в описани шаблона?
      Ответить
      • Вам нужно освежиться. Переплываете экватор?
        Ответить
        • Экватором в данном говнокоде является (1+53)/2=27я строчка.
          В ней написано int foo;
          Переплывать инт фуу я бы не стал, наверное, это очень противно, во всяких фуу плавать.
          Ответить
          • >Экватором в данном говнокоде является (1+53)/2
            Это код на С++. Тут строчки с 0 отсчитываются (0+53)/2
            Ответить
      • На 6ой строке. Разве не видно?
        Ответить
        • показать все, что скрытоА, ну да.
          То есть в качестве параметра шаблона можно даже вставлять такие выражения, как
          Event e) const { return e.priority
          ?
          Отвратительный язык...
          Ответить
          • Более того, если посмотреть исходный код данной страницы можно также увидеть большое количество шаблонных конструкций, которые и не такое позволяют вставлять в угловые скобочки.
            Отвратительный язык©
            Ответить
          • Дельфи7 не поддерживает перегрузку оператор<? Что уж говорить о шаблонах...
            Ответить
          • Это был сарказм...

            -- КЭП.
            Ответить
    • крестоговнецо.
      Ответить

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