- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
template <typename T> 
void doSomething(const T& i_field, unsigned int i_offset)
{
   ...
}
template <> 
void doSomething<Boo>(const Boo& i_field, unsigned int i_offset)
{
   doSomething(i_field.aaa, i_offset + offsetof(Boo, aaa));
   doSomething(i_field.bbb, i_offset + offsetof(Boo, bbb));
   doSomething(i_field.ccc, i_offset + offsetof(Boo, ccc));
}
...
template <class T, typename S>
void addSomething(S T::* i_pField)
{
   const T* pR = 0;
   const unsigned int offset = (unsigned int)&(pR->*i_pField);
   doSomething(pR->*i_pField, offset);
}
                                 
        
            Увидел вот такой код (рабочий!) в одном довольно крупном проекте.
        
        
Всё ещё хуже... Не нулевой, а вообще мусорный (чуть больше 0, в зависимости от смещения поля)... ПоUBивал бы.
> дергает его поля
Только адреса берёт, поэтому пока что не падает.
И даже ошибки при всяких виртуальных наследованиях. И в этом его огромный плюс перед самодельным велосипедом, который на них тупо сегфолтнется.