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

    +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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    // reflection.h
    template <class T>
    QStringList getPropertyList(T)
    {
      const QMetaObject& metaObject = T::staticMetaObject;
      ...
      return properties;
    }
    
    // Copy-pasted, the parameter now is T*
    template <class T>
    QStringList getPropertyList(T*)
    {
      const QMetaObject& metaObject = T::staticMetaObject;
      ...
      return properties;
    }
    
    // In other headers
    class IMessage
    {
    public:
      virtual ~IMessage();
      ...
    };
    
    class File
      : public IMessage
    {
      ...
    };
    
    class Text
      : public IMessage
    {
      ...
    };
    
    // Usage of all this
    QStringList p;
    p << getPropertyList(File());
    p << getPropertyList(Text());
    p << getPropertyList(static_cast<IMessage*>(new File()));

    Работаю с шаблонами и теку

    Запостил: salamon_style, 05 Ноября 2019

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

    • показать все, что скрытоvanished
      Ответить
    • В чём говно?
      Ответить
      • В жопе.

        Отвалилась жопа, и вам всё равно? Акция: две жопы по цене одного.
        Ответить
      • В последней строчке (точнее, оно там всплывает). PropertyList берется не по типу объекта, а по статическому типу переменной. То есть если мы передаем в функцию IMessage, то свойства потомка мы не увидим. Может быть, конечно, так и надо зачем-то?
        Ответить
        • Штож, vtable + std::type_info спасет отца рефлексии

          https://wandbox.org/permlink/TtLxVOn2yluUT7DB
          Ответить
      • 1) Не понимаем, как использовать шаблоны от слова совсем
        2) Мы копипастим как следствие пункта 1
        3) Опять же, как следствие пункта 1, мы вызываем конструкторы объектов вместо того, чтобы просто передать тип
        4) Ну и как вишенка на торте - в последнем случае мы просто течем, так как нахера вызывать delete? Памяти мало что ли?
        5) Понимание того, что static_cast<T>(...) - тоже шаблон (внезапно!) и что надо делать по аналогии, у автора данного кода отсутствует напрочь. Чукча не читатель, чукча писатель.
        Вот как можно переписать этот код (любой джуниор это сделает это с закрытыми глазами)
        template <class T>
        QStringList getPropertyList()
        {
          const QMetaObject& metaObject = T::staticMetaObject;
          ...
          return properties;
        }
        
        QStringList p;
        p << getPropertyList<File>();
        p << getPropertyList<Text>();
        p << getPropertyList<IMessage>();
        Ответить

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