1. C++ / Говнокод #19243

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 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);
    }

    Увидел вот такой код (рабочий!) в одном довольно крупном проекте.

    Запостил: -Eugene-, 25 Декабря 2015

    Комментарии (12) RSS

    • Может быть у них оператор = с T* переписан. Если нет, то где-то стоит огромный try/catch
      Ответить
      • Не-а. Просто у поля используется в куче мест только тип, а само значение - нет.
        Ответить
    • Никера не понял что этот код делает, и к чему тут строки 1-13
      Ответить
      • К тому, что куча функций принимает по референсу нулевой указатель и дергает его поля
        Ответить
        • > по референсу нулевой указатель
          Всё ещё хуже... Не нулевой, а вообще мусорный (чуть больше 0, в зависимости от смещения поля)... ПоUBивал бы.

          > дергает его поля
          Только адреса берёт, поэтому пока что не падает.
          Ответить
    • Разыменование nullptr - UB.
      Ответить
      • ... но, тем не менее, распространенная практика для вычисления сдвига поля относительно начала структуры.
        Ответить
        • ...используемая людьми, не могущими запомнить, что единственный кошерный способ узнать это — макро offsetof
          Ответить
          • offsetof - нестандарт для не-POD типов, может предупреждения кидать.
            Ответить
            • > может предупреждения кидать
              И даже ошибки при всяких виртуальных наследованиях. И в этом его огромный плюс перед самодельным велосипедом, который на них тупо сегфолтнется.
              Ответить
          • ...и тем не менее, говнокод не в этом
            Ответить
        • Ещё для вызова статиков в Qt юзали что-то в духе:
          static_cast<T*>(0)->someStaticMethod();
          Ответить

    Добавить комментарий