- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 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.02.2011 19:20 # 0
Dummy00001 16.02.2011 19:33 # +1
параметризировать темлейт поинтером "typedef TEvent<Entity,&Entity::AFunc> someEvent;" вроде бы как нельзя (т.к. поинтер резолвится в рантайме, а темплейты генерятся компилером).
или?
CHayT 17.02.2011 09:48 # 0
typedef TEvent<Entity,&Entity::AFunc> - явно ресолвится в компайлтайме. Он компайлтайм ссылки спокойно кушает в качестве аргументов шаблона. Так можно даже float в шаблон передать. Но код получается непереносимый.
guest 15.02.2011 19:28 # −1
Lure Of Chaos 15.02.2011 20:05 # 0
guest 16.02.2011 01:48 # +2
Обычный "код - проверка".
rat4 16.02.2011 08:56 # +1
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()()
TarasB 16.02.2011 12:19 # −4
Не понял, а где вторая угловая скобочка в описани шаблона?
guest 16.02.2011 12:42 # +2
TarasB 16.02.2011 13:19 # −1
В ней написано int foo;
Переплывать инт фуу я бы не стал, наверное, это очень противно, во всяких фуу плавать.
guest 16.02.2011 14:58 # +1
Это код на С++. Тут строчки с 0 отсчитываются (0+53)/2
TarasB 16.02.2011 15:08 # +1
absolut 16.02.2011 15:33 # +4
absolut 16.02.2011 13:42 # +2
TarasB 16.02.2011 14:28 # −5
То есть в качестве параметра шаблона можно даже вставлять такие выражения, как
Event e) const { return e.priority
?
Отвратительный язык...
absolut 16.02.2011 14:45 # +2
Отвратительный язык©
guest 16.02.2011 15:02 # 0
TarasB 16.02.2011 15:09 # −2
<?php?>
xaionaro 16.02.2011 19:58 # +1
-- КЭП.
danilissimus 16.02.2011 14:59 # +1