Russian Qt Forum
Ноябрь 22, 2024, 23:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Голосование
Вопрос: Насколько легко (или трудно) поддерживать пример кода ниже ?
Легко
Придется немного посидеть
Придется долго вникать
Дешевле все переписать
Ваш вариант

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сопровождение кода template  (Прочитано 5208 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Январь 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). Я сделал "скелетик" - переписал структуру классов в тестовый проект, вот это и есть код выше. Впрочем мне это не помогло - тестовый почему-то линкуется отлично  Улыбающийся
« Последнее редактирование: Январь 08, 2015, 12:14 от Igors » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Январь 08, 2015, 17:22 »

Вопрос не корректен..(

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

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




Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 09, 2015, 09:17 »

Вопрос не корректен..(

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

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

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

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

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

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

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

Ради ненужного ответа на ненужный вопрос вникать в шаблоны - нафиг надо. Попусту, без выгоды для себя, никто не любит утруждаться Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 09, 2015, 11:09 »

Ради ненужного ответа на ненужный вопрос вникать в шаблоны - нафиг надо. Попусту, без выгоды для себя, никто не любит утруждаться Улыбающийся
Ага, значит утруждаться придется (еще и как) - так почему же Вы не нажали заготовленную бубочку "придется долго вникать", а вместо этого свистите про "ненужный" ответ/вопрос ? Улыбающийся

-------

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

Сообщений: 2095



Просмотр профиля
« Ответ #5 : Январь 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;
};
 

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #6 : Январь 09, 2015, 13:31 »

А не ответил на опрос потому, что даже не пробовал его рассмотреть. Следовательно любой мой вывод будет недоказанным и необосновенным Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 10, 2015, 09:06 »

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

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

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Январь 10, 2015, 17:05 »

А в классе ID<T> где-нибудь ещё используется class T и если да, то как?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 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;
};
Ну и перекрытые операторы -> и др (в стиле шаред пойнтера)
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #10 : Январь 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;}
        ...
};

« Последнее редактирование: Январь 21, 2015, 21:04 от _Bers » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.171 секунд. Запросов: 24.