Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Января 08, 2015, 11:02



Название: Сопровождение кода template
Отправлено: Igors от Января 08, 2015, 11:02
Добрый день

Сначала сам код
Код
C++ (Qt)
template <class T>
struct ID {
//...
static ID<T> statID;
};
 
template<class T> ID<T> ID<T>::statID;
 
template<class T>
struct Object {
Object( ID <T> & parent );
// ...
 
// data
ID<T> mID;
};
 
struct Object_A : public Object<Object_A> {
// ...
};
 
struct Object_B : public Object<Object_B> {
//...
};
 
template<class T>
struct Container : public T {
// ...
};
 
template<class T>
struct Layer : public Container<T> {
//...
};
 
typedef Layer <Object_A> Layer_A;
typedef Layer <Object_B> Layer_B;
 
При переходе с gcc на clang эта конструкция заклинила - сначала на компиляции, а потом на линковке (unresolved statID). Я сделал "скелетик" - переписал структуру классов в тестовый проект, вот это и есть код выше. Впрочем мне это не помогло - тестовый почему-то линкуется отлично  :)


Название: Re: Сопровождение кода template
Отправлено: m_ax от Января 08, 2015, 17:22
Вопрос не корректен..(

Какой смысл поддерживать неработающий говнокод? И то что он когда-то и где-то там работал, не означает, что он корректен с точки зрения языка.
А от такого кода нужно сразу отказываться и писать правильно) Ну о важности архитектуры и времени для неё уделяемой, я скромно промолчу) 

Код
C++ (Qt)
struct Object_A : public Object<Object_A>
 
Так делать можно только тогда, когда размер Object<T> известен на стадии компиляции (и не зависит от T). Иначе получите зацикливание..






Название: Re: Сопровождение кода template
Отправлено: Igors от Января 09, 2015, 09:17
Вопрос не корректен..(

Какой смысл поддерживать неработающий говнокод? И то что он когда-то и где-то там работал, не означает, что он корректен с точки зрения языка.
А от такого кода нужно сразу отказываться и писать правильно) Ну о важности архитектуры и времени для неё уделяемой, я скромно промолчу) 
Прошу пояснить:

- чем некорректен вопрос ???  Во всяком случае это пример из реальной практики

- в чем "говнокодистость"? Может Вас смутило struct - так это я написал, в оригинале там class, у каждого куча методов (даже есть virtual'ы), и все оформлено очень аккуратно. 

- в чем некорректность с точки зрения языка? Темплейт "на себя" - ну это даже я знаю :) Да, надо соблюдать осторожность, но так делать не запрещено.

- и наконец - ну а как же писать правильно? Вот Вы объявили это говнокодом (чужую корову легко охаять), ну хорошо. Допустим (просто допустим) Вы переделали этот код, создали крепкую архитектуру, в конце-концов - работает. Приходит другой знаток, и вот, так же как Вы, уверенно заявляет: "говнокод, снести нахрен". Или Вы думаете что с Вашим кодом этого никогда не случится? Потому что он будет куда легче и прозрачнее для понимания? Я в этом сильно сомневаюсь :) 

---------------

Понятно почему из сотни прочитавших проголосовало лишь двое (пока) проголосовало. Неудобно выбирать "долго вникать" - выходит не знаю языка, а сказать "легко" - неправда. Лично я, посмотрев на этот код 5-10 минут не смог осознать "конструкцию" и понять (ну хотя бы примерно) что он делает. Пришлось отложить свои дела (которые я считал важными) и углубиться в изучение. Через полтора-два дня начало доходить в чем был авторский замысел. Он совсем не глуп, и даже по-своему красив. А обычно реакция переделывающего не очень приятная, напр
Цитировать
сука, сволочь, падла, тварь! Поймать и бить по хрюкальнику пока все темплейты не уберет!
(это в литературной форме :))


Название: Re: Сопровождение кода template
Отправлено: Bepec от Января 09, 2015, 10:34
Ради ненужного ответа на ненужный вопрос вникать в шаблоны - нафиг надо. Попусту, без выгоды для себя, никто не любит утруждаться :)


Название: Re: Сопровождение кода template
Отправлено: Igors от Января 09, 2015, 11:09
Ради ненужного ответа на ненужный вопрос вникать в шаблоны - нафиг надо. Попусту, без выгоды для себя, никто не любит утруждаться :)
Ага, значит утруждаться придется (еще и как) - так почему же Вы не нажали заготовленную бубочку "придется долго вникать", а вместо этого свистите про "ненужный" ответ/вопрос ? :)

-------

Код этот вполне успешно работал. Др программисты (в том числе и я) просто "юзали" его не вникая в подробности - в основном нужно было создавать контейнеры и добавлять в них эл-ты нужного типа, это делалось "по образцу" имеющегося кода. Расширение "инстанциации" (напр Object_C, Layer <Object_C>) не понадобилось ни разу. Зато неск других задач (гораздо бОльших) используют эту структуру как базовую. Поэтому снести/переписать ее практически нереально.


Название: Re: Сопровождение кода template
Отправлено: m_ax от Января 09, 2015, 13:13
Цитировать
Прошу пояснить:
Поясняю:

Цитировать
- чем некорректен вопрос
Вы предлагаете поддерживать и сопровождать неработающий код. Какой в этом смысл?

Цитировать
- в чем "говнокодистость"?

Ну хотя бы в том, что он не работает) Потом, объясните смысл этой конструкции и как она в реальном коде используется:
Код
C++ (Qt)
template <class T>
struct ID {
//...
static ID<T> statID;
};
 

Цитировать
- и наконец - ну а как же писать правильно?
Вообще или конкретно здесь?
Поскольку я не знаю всего, что за этим кодом скрывается и как это используется, то что-либо посоветовать не могу)

Попробуйте заменить это
Код
C++ (Qt)
struct ID {
//...
static ID<T> statID;
};
 

на

Код
C++ (Qt)
struct ID {
//...
static boost::recursive_wrapper<ID<T>> statID;
};
 



Название: Re: Сопровождение кода template
Отправлено: Bepec от Января 09, 2015, 13:31
А не ответил на опрос потому, что даже не пробовал его рассмотреть. Следовательно любой мой вывод будет недоказанным и необосновенным :)


Название: Re: Сопровождение кода template
Отправлено: Igors от Января 10, 2015, 09:06
Вы предлагаете поддерживать и сопровождать неработающий код. Какой в этом смысл?
...
Ну хотя бы в том, что он не работает)
Откуда такой вывод? См первый пост:
При переходе с gcc на clang эта конструкция заклинила
Ну знаете, если при каждой template-проблеме компилятора (а они сыпятся как из ведра), я стану "переписывать все"...

Потом, объясните смысл этой конструкции и как она в реальном коде используется:
Код
C++ (Qt)
template <class T>
struct ID {
//...
static ID<T> statID;
};
 
ID обеспечивает глобальный список объектов, по ID можно получить Object и наоборот. Если объект удален из глобального списка (или еще в него не вставлен), то его ID == statID


Название: Re: Сопровождение кода template
Отправлено: m_ax от Января 10, 2015, 17:05
А в классе ID<T> где-нибудь ещё используется class T и если да, то как?


Название: Re: Сопровождение кода template
Отправлено: Igors от Января 10, 2015, 17:31
А в классе ID<T> где-нибудь ещё используется class T и если да, то как?
Да. конечно
Код
C++ (Qt)
template <class T>
struct ID {
//...
       Object <T> * mObject;
       ID<T> * mPrev, * mNext;
 
static ID<T> statID;
};
Ну и перекрытые операторы -> и др (в стиле шаред пойнтера)


Название: Re: Сопровождение кода template
Отправлено: _Bers от Января 21, 2015, 20:58
Код:
struct Object_A : public Object<Object_A> 

зацикливание..

Нет никакого зацикливания.

Есть нюансы, но в целом ничего особенного.
Довольно распространенная практика.

Самый большой косяк, который здесь может вылезти: вижал студия жрет только в путь.

Гцц/шланги могут обидиться, если базовый шаблон тронет лишнее.
Но это будет вполне себе читабельная ошибка компилятора, а не "зацикливание".



Код:
template <class T>
struct ID {
static ID<T> statID;
        ...
};

Пишите проще:

Код:
template <class T>
struct ID {
static ID statID;
        ...
};

И раз уж пошла телега за шаблоны, тогда уж сразу по уму:

Код:
template <class T>
struct ID {

...
static ID getID() { return _getID(); }
protected:
static ID& _getID(){ static ID id; return id;}
        ...
};