- 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);
}
Увидел вот такой код (рабочий!) в одном довольно крупном проекте.
guest 25.12.2015 18:03 # 0
-Eugene- 25.12.2015 18:26 # 0
3_dar 25.12.2015 18:14 # 0
-Eugene- 11.01.2016 12:01 # 0
bormand 11.01.2016 18:07 # 0
Всё ещё хуже... Не нулевой, а вообще мусорный (чуть больше 0, в зависимости от смещения поля)... ПоUBивал бы.
> дергает его поля
Только адреса берёт, поэтому пока что не падает.
roman-kashitsyn 25.12.2015 18:21 # +3
imihajlov 25.12.2015 18:24 # +1
Soul_re@ver 25.12.2015 21:29 # +2
guest 26.12.2015 09:05 # 0
bormand 26.12.2015 10:09 # +1
И даже ошибки при всяких виртуальных наследованиях. И в этом его огромный плюс перед самодельным велосипедом, который на них тупо сегфолтнется.
-Eugene- 11.01.2016 11:57 # 0
bormand 25.12.2015 21:49 # 0