- 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
class CBaseEntity {
// ...
void (CBaseEntity ::*m_pfnThink)(void);
virtual void Think( void ) { if (m_pfnThink) (this->*m_pfnThink)(); };
// ...
// Ugly code to lookup all functions to make sure they are exported when set.
#ifdef _DEBUG
void FunctionCheck( void *pFunction, char *name )
{
if (pFunction && !NAME_FOR_FUNCTION((uint32)pFunction) )
ALERT( at_error, "No EXPORT: %s:%s (%08lx)\n", STRING(pev->classname), name, (uint32)pFunction );
}
BASEPTR ThinkSet( BASEPTR func, char *name )
{
m_pfnThink = func;
FunctionCheck( (void *)*((int *)((char *)this + ( offsetof(CBaseEntity,m_pfnThink)))), name );
return func;
}
// ...
};
// Ugly technique to override base member functions
// Normally it's illegal to cast a pointer to a member function of a derived class to a pointer to a
// member function of a base class. static_cast is a sleezy way around that problem.
#ifdef _DEBUG
#define SetThink( a ) ThinkSet( static_cast <void (CBaseEntity::*)(void)> (a), #a )
// ...
#else
#define SetThink( a ) m_pfnThink = static_cast <void (CBaseEntity::*)(void)> (a)
// ...
#endif
Ну и косвенный вызов метода ребёнка с this'ом от родителя смотрится странновато, даже если наследование не множественное...
Да и зачем кастить?:
http://ideone.com/LLLk3C
п.с. какой тут тэг для линка?
Кстати, в 1С-то, оказывается, та же беда:
> Выборка = Результат[1].Выбрать();
> | 0 КАК ЛимитСрок
> Если СтрДлина(Комментарий) < 11 Тогда
Только вот всякие питоносишки разрабатывали для американцев и тех, у кого раскладки похожие, а 1С - как раз для тех, у кого "[", "]", "<", ">" и "|" нет.
Предлагаю улучшить 1С и каждую переменную именовать, начиная с "$".
> самая маленькая из проблем
Ну не скажи. Мне при слепой печати пиздец как мешать будет. Я минут через 10 уже психанул бы поди :)
altgr + 7 {
altgr + 0 }
altgr + 8 [
altgr + 9 ]
Видимо питон придумал немец, чтобы не писать { }.
И набираешь их левой рукой, держа правую на altgr.
Итого: через altgr (альт справа) набирается |[]{}\~€@. Программируйте на здоровье.
> самая маленькая из проблем
ОК, самая маленькая из проблем для тех кто пользуется ей больше хотя бы года
Хм, ` (которая у нас на ё) со второго раза срабатывает и превращается в ^. В чём фишка? Это какая-то эскейп-последовательность для редких символов.
З.Ы. Ага, хвостики какие-то дорисовывает у всяких j.
ĵjĴJ
первое время мне приходилось где-то раз в пять минут закрывать глаза и считать до 30, чтобы не разнести клавиатуру
потом подобное повторилось в чуть меньших масштабах, когда переучивался в обратную сторону
Ну для удобства. Методы, которые в SetThink передают, они же только в дочернем классе есть. А хочется их в коллбек засунуть, причём этот коллбек дёргает база...
Да на самом деле, можно заворачивать всё это в какой-нибудь std::function или его аналог и не париться... А если совсем критично по пирфомансу - кастомный аллокатор с пулом поможет.
М.б. с этим проблемы были в середине 90x
И ещё какие... В Qt тоже всё своё мутили по тем же самым причинам...
Указатели кастовали-кастовали, да не выкастовывали.
http://javascript.ru/forum/offtopic/59326-coffee-rozhdenie-legendy.html
>offtopic
>rozhdenie-legendy.html
Хм... Почему у меня движок ГК не подсвечивает ссылку зеленым?