- 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.
(Этот код - проверка, будет ли работать прототип велосипедного делегата)
параметризировать темлейт поинтером "typedef TEvent<Entity,&Entity::AFunc> someEvent;" вроде бы как нельзя (т.к. поинтер резолвится в рантайме, а темплейты генерятся компилером).
или?
typedef TEvent<Entity,&Entity::AFunc> - явно ресолвится в компайлтайме. Он компайлтайм ссылки спокойно кушает в качестве аргументов шаблона. Так можно даже float в шаблон передать. Но код получается непереносимый.
Обычный "код - проверка".
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()()
Не понял, а где вторая угловая скобочка в описани шаблона?
В ней написано int foo;
Переплывать инт фуу я бы не стал, наверное, это очень противно, во всяких фуу плавать.
Это код на С++. Тут строчки с 0 отсчитываются (0+53)/2
То есть в качестве параметра шаблона можно даже вставлять такие выражения, как
Event e) const { return e.priority
?
Отвратительный язык...
Отвратительный язык©
<?php?>
-- КЭП.