Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
// 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()));
В последней строчке (точнее, оно там всплывает). PropertyList берется не по типу объекта, а по статическому типу переменной. То есть если мы передаем в функцию IMessage, то свойства потомка мы не увидим. Может быть, конечно, так и надо зачем-то?
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>();
Отвалилась жопа, и вам всё равно? Акция: две жопы по цене одного.
https://wandbox.org/permlink/TtLxVOn2yluUT7DB
2) Мы копипастим как следствие пункта 1
3) Опять же, как следствие пункта 1, мы вызываем конструкторы объектов вместо того, чтобы просто передать тип
4) Ну и как вишенка на торте - в последнем случае мы просто течем, так как нахера вызывать delete? Памяти мало что ли?
5) Понимание того, что static_cast<T>(...) - тоже шаблон (внезапно!) и что надо делать по аналогии, у автора данного кода отсутствует напрочь. Чукча не читатель, чукча писатель.
Вот как можно переписать этот код (любой джуниор это сделает это с закрытыми глазами)