Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Stl: в чем плюсы шаблонов? 
:(
    Опции темы
Lazin
Дата 28.5.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



критика у вас какая-то примитивная, вот к примеру Александресску делает это правильно, он говорит что концепция итераторов не верна и вместо этого нужно использовать концепцию диапазонов(ranges), это позволило-бы сильно упростить код а так-же добавить функции, которые сейчас сложно реализуемы, например проверку корректности итераторов без падения производительности. С таким дизайном STL как сейчас проверка валидности итераторов(если ее включить) заметно снижает производительность.
Я бы еще хотел что-бы в STL была реализована концепция views. Это что-то вроде алгоритмов, в общем я хотел-бы иметь возможность писать так:
Код

std::transform_view<my_functor_type> view(loooong_sequence.begin(), loooong_sequence.end(), my_functor);
std::transform_view<my_another_functor_type> another_view(gen1.begin(), gen1.end(), my_another_functor);
std::copy(dest, another_view.begin(), another_view.end());

В общем, view это что-то вроде контейнера, элементы которого не хранятся в нем, а вычисляются по требованию. Это позволит реализовать ленивые вычисления в стиле STL, что иногда бывает необходимо. К примеру, когда loooong_sequence не просто контейнер, а сложный объект, который загружает данные по требованию, или когда нельзя загрузить все данные полностью(loooong_sequence это istream_iterator большого файла, который не помещается в память полностью), либо когда последовательность loooong_sequence - бесконечна, а вся логика приложения реализована в функторах, переданных в view.
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 28.5.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Эту тему нужно повесить в вики)))
Вот. Читаю, учусь.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 28.5.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Lazin @  27.5.2009,  22:43 Найти цитируемый пост)
запах победы! smile 

У каждой профессии запах особый smile 

Цитата(Alek86 @  27.5.2009,  23:14 Найти цитируемый пост)
еще минус - при их серьезном использовании вылазят такие ошибки компилятора, о которых и не догадывался. причем иногда (в случае VS 2005 очень редко, но метко), это ошибки именно компилятора, когда он действует не по стандарту

не совсем понятно о чем речь. 

Цитата(Alek86 @  27.5.2009,  23:14 Найти цитируемый пост)
также минусы стл и буста прочувствуются, когда программа будет вести себя не так, как ожидалось и нужно будет продебажить их внутренности. конечно, на 99,999% ошибка будет не в стл иди бусте, а у самого программиста, но поиск этой ошибки будет лежать через сплошные тернии шаблонов, traits'ов и т.п.

обычно чтения докумментации по поведению того или иного класса должно быть достаточно. Если библиотека не соответствует своему описанию - это проблема разработчика библиотеки.

Если научиться читать ошибки стл - все будет в порядке. Они жутко выглядят только для неопытного глаза, если привыкнуть - читается как обычные.

Это сообщение отредактировал(а) azesmcar - 28.5.2009, 09:00
PM   Вверх
Alexeis
Дата 28.5.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Lazin @  27.5.2009,  21:43 Найти цитируемый пост)
даже если он сложнее, то он не эквивалентен фукционально классу, реализующему тот же функционал для заданного типа, поэтому их нельзя сравнивать
к тому-же это не имеет отношения к STL, так как мы пользователи библиотеки а не разработчики 

   Применительно к одной отдельно взятой ситуации частная реализация будет проще, если использовать в нескольких ситуациях с разными типами, код шаблона может оказаться проще, а может и не оказаться, ведь отладка шаблонного класса сложнее.

Добавлено через 8 минут и 24 секунды
Цитата(azesmcar @  28.5.2009,  07:59 Найти цитируемый пост)
не совсем понятно о чем речь. 

  Думаю смысл в том что все новомодные фичи еще плохо обкатаны, поэтому не стоит торопиться их лепить везде и сразу, поскольку компиляторы пишут тоже люди, которые совершают ошибки. Но шаблонам уже лет 15-20 как минимум, так что основные фичи работают стабильно, нельзя сказать что сами шаблоны нестабильный механизм.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alek86
Дата 28.5.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Lazin @  28.5.2009,  08:48 Найти цитируемый пост)
критика у вас какая-то примитивная

в смысле примитивная? критика бывает верной или неверной.
писал я не для крутых шаблонщиков, что знают напамять все правила разрешений перегрузки и т.п.
те, кто с шаблонами и бустом набил кучу шишек, конечно, таких проблем не замечают (и считают, что остальные тоже должны их с легкостью решать)

Цитата(azesmcar @  28.5.2009,  08:59 Найти цитируемый пост)
не совсем понятно о чем речь. 

точный пример такой ошибки компилятора привести сейчас не смогу
бывает просто, что ожидаешь, что компилер видит эту шаблонную функцию, а на самом деле он подставляет совсем другую и по этому поводу матерится.

Цитата(azesmcar @  28.5.2009,  08:59 Найти цитируемый пост)
Если научиться читать ошибки стл - все будет в порядке.

а если полностью разобраться во внутренностях буста, то все вообще будет отлично smile

Это сообщение отредактировал(а) Alek86 - 28.5.2009, 09:55


--------------------
user posted image    user posted image
PM MAIL   Вверх
azesmcar
Дата 28.5.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Alek86 @  28.5.2009,  09:34 Найти цитируемый пост)
а если полностью разобраться во внутренностях буста, то все вообще будет отлично smile 

на данный момент это будет сложно - так как для буста практически нет книг, плюс он динамически растет и меняется. Он не вошел в стандарт, потому пока что никаких точных данных вам никто не предоставит. А вот с СТЛ такой проблемы нет. Он стандартиризован. Будут несоответствия - кройте матом производителя. smile 
PM   Вверх
mes
Дата 28.5.2009, 09:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alexeis @  28.5.2009,  08:26 Найти цитируемый пост)
   Применительно к одной отдельно взятой ситуации частная реализация будет проще, если использовать в нескольких ситуациях с разными типами, код шаблона может оказаться проще, а может и не оказаться, ведь отладка шаблонного класса сложнее.


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


Это сообщение отредактировал(а) mes - 28.5.2009, 09:52


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 28.5.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



azesmcar, я именно про процесс отладки
неужели тебе никогда не приходилось отлаживать (в смысле смотреть, что куда девается, а не искать в нем ошибку) какой-нить стандартный поток, ибо после его использования получал не то, что хотел?


--------------------
user posted image    user posted image
PM MAIL   Вверх
GoldFinch
Дата 28.5.2009, 10:56 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



насчет кривых реализаций -
Код

Cont::iterator e=cont.end();
cont.resize(cont.size()+1);
*e=1;

в MSVC2008 при разыменовании e чтобы проверить границы контейнера
в релиз версии используется assert(this<end()) 
в дебаг версии используется assert(this<_Mylast) , где _Mylast - значение end() сохраненное при создании итератора

в результате прога нормально работает в релизе и падает при попытке отладить
PM MAIL ICQ   Вверх
mes
Дата 28.5.2009, 11:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  28.5.2009,  09:56 Найти цитируемый пост)
насчет кривых реализаций -

Ваш код потенциально опасен. 

Цитата

resize(size_type sz, T c = T());

  Effects:
        if (sz > size())
          insert(end(), sz-size(), c);
        else if (sz < size())
          erase(begin()+sz, end());
        else
          ; // do nothing

Цитата

 23.2.4.3 
  ... insert ...
  Notes:
    Causes  reallocation  if the new size is greater than the old capac-
    ity.  If no reallocation happens, all the iterators  and  references
    before the insertion point remain valid.

Для того, чтоб  resize не вызвал переаллокацию памяти я предполагаю, что Вы удостоверились, что capacity не меньше new_size.
Ваш итератор не находится before the insertion point, а следовательно он не валиден.






--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 28.5.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Alek86 @  28.5.2009,  09:52 Найти цитируемый пост)
azesmcar, я именно про процесс отладки
неужели тебе никогда не приходилось отлаживать (в смысле смотреть, что куда девается, а не искать в нем ошибку) какой-нить стандартный поток, ибо после его использования получал не то, что хотел?

не так часто чтобы делать из этого проблему smile

потому и сказал
Цитата(azesmcar @  28.5.2009,  08:59 Найти цитируемый пост)
обычно чтения докумментации по поведению того или иного класса должно быть достаточно

понимаю что человек не идеален, вполне может забыть как ведет себя к примеру вектор в той или иной ситуации. Потому и говорю - обычно.
А в идеале - этого достаточно.
Человек может не знать о том что хранить auto_ptr в контейнерах нельзя. И не исключаю что потом ночами он будет мучать себя и дебагер чтобы понять почему его указатели обнулились, но знающий человек поймет. smile 

Это сообщение отредактировал(а) azesmcar - 28.5.2009, 11:16
PM   Вверх
mes
Дата 28.5.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  28.5.2009,  10:13 Найти цитируемый пост)
Человек может не знать о том что хранить auto_ptr в контейнерах нельзя. И не исключаю что потом ночами он будет мучать себя и дебагер чтобы понять почему его указатели обнулились, но знающий человек поймет. smile 

к счастью многих на нормальном компиляторе стандартные контейнеры такого не допустят.  smile 


Это сообщение отредактировал(а) mes - 28.5.2009, 11:26


--------------------
PM MAIL WWW   Вверх
zim22
Дата 28.5.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Из книжечки Мэтью Улисона "Практический подход к решению проблем программирования С++" (стр.483)
Цитата

Дефект: механизм инстанциирования шаблонов в С++ использует принятые аргументы без учета того, как и в какой форме эти аргументы впоследствии применяются внутри шаблонов. Это может привести к генерации неэффективного и/или ошибочного программного кода, поскольку временные экземпляры типа класса могут создаваться по ходу продвижения аргументов по шаблону.




--------------------
PM MAIL   Вверх
Alexeis
Дата 28.5.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(zim22 @ 28.5.2009,  10:27)
Из книжечки Мэтью Улисона "Практический подход к решению проблем программирования С++" (стр.483)
Цитата

Дефект: механизм инстанциирования шаблонов в С++ использует принятые аргументы без учета того, как и в какой форме эти аргументы впоследствии применяются внутри шаблонов. Это может привести к генерации неэффективного и/или ошибочного программного кода, поскольку временные экземпляры типа класса могут создаваться по ходу продвижения аргументов по шаблону.

  Моск взорвался  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zim22
Дата 28.5.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Alexeis @  28.5.2009,  11:54 Найти цитируемый пост)
 Моск взорвался    smile 

прочитайте лучше в книжечке. там страниц 10-20 об этом написано. я всё не могу набирать smile

Давайте рассмотрим класс String:
Код

class String {
public:
  typedef std::string const &value_type;
public:
  explicit String(std::string const &value);
  explicit String(char const *value);
public:
  std::string const &GetValue() const;
  // ...
};


Мы можем использовать его с текущим определением Wrapper таким образом:
(примечание от меня: какое определение было текущим я не знаю, поэтому приведу оба)
1 определение Wrapper:
Код

template <typename T>
class Wrapper : public T { 
//... 
};

2 определение Wrapper:
Код

template <typename T>
class Wrapper : public T {
  // ...
public:  
  Wrapper() { }
  template <typename T1>
  explicit Wrapper(T1 t1) : base_class_type(t1) { }
  // ...
};

Использование Wrapper:
Код

typedef Wrapper<String> String_t;
std::string ss("A std::string instance");
String_t s1("A c-style string"); // Нормально
String_t s2(ss); // Нормально, но..

Конструкторы компилируются нормально, и программный код работает так, как ожидается, но имеется скрытый недостаток. Выполнение конструктора s2 приводит к созданию двух копий строки ss там, где мы ожидали и хотели получить лишь одну. Дополнительная копия создается, т.к. компиляторы инстанциируют шаблон на основе передаваемых ему типов аргументов без учета того, как они могли бы использовать внутри него. Таким образом, выполняемая работа по созданию s2 фактически эквивалентна следующему:
Код

Wrapper<String>::Wrapper(String s) : m_value(s)  {}

Это и есть дефект.


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.