Кресты / Говнокод #5687 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 CHayT, (Updated )

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

    • какой компилер?

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

      или?
      Ответить
      • msvc.
        typedef TEvent<Entity,&Entity::AFunc> - явно ресолвится в компайлтайме. Он компайлтайм ссылки спокойно кушает в качестве аргументов шаблона. Так можно даже float в шаблон передать. Но код получается непереносимый.
        Ответить
  • Где говно? Ткните носом.
    Обычный "код - проверка".
    Ответить
  • > 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
          Ответить
      • А, ну да.
        То есть в качестве параметра шаблона можно даже вставлять такие выражения, как
        Event e) const { return e.priority
        ?
        Отвратительный язык...
        Ответить
        • Более того, если посмотреть исходный код данной страницы можно также увидеть большое количество шаблонных конструкций, которые и не такое позволяют вставлять в угловые скобочки.
          Отвратительный язык©
          Ответить
        • Дельфи7 не поддерживает перегрузку оператор<? Что уж говорить о шаблонах...
          Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8