Чем порочна такая практика разработки дизайна? Говорит ли стандарт об этом что-нибудь?
Чревато ошибками, и не допониманием со стороны окружающих
кстати this преобразуется не правильно.
Плохо только одно -- это будет работать не правильно. impl *this никакого отношения не имеет к final *this.
Учи мат часть
Re[3]: static_cast<final_class*>(this)
От:
Аноним
Дата:
18.02.08 10:48
Оценка:
Здравствуйте, Аноним, Вы писали: А>impl *this никакого отношения не имеет к final *this.
Имеет, и самое прямое. final является наследником impl. А>Учи мат часть
пересмотри приведенный мною код
Re[2]: static_cast<final_class*>(this)
От:
Аноним
Дата:
18.02.08 10:53
Оценка:
Здравствуйте, Аноним, Вы писали:
А>А чем плох
А>
А>final_class::BaseFoo()
А>
тем, что этот вызов годен лишь только в том случае, когда BaseFoo объявлена как static
Здравствуйте, Аноним, Вы писали:
А>Чем порочна такая практика разработки дизайна?
Такая практика дизайна порочна тем, что выровненный по табам код
1) расползается к чертям, если установлен другой размер табуляции;
2) трудно поддаётся модификации из-за необходимости поддерживать выравнивание.
А так код вполне нормальный, гуглить надо по запросам «CRTP», «Couriosly Recurring Template Pattern», плюс посмотреть в книжке Вандевурда, там тоже есть описание. CRTP является статическим аналогом паттерна Template Method.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: static_cast<final_class*>(this)
От:
Аноним
Дата:
18.02.08 13:03
Оценка:
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Аноним, Вы писали:
А>>Чем порочна такая практика разработки дизайна?
Q>Такая практика дизайна порочна тем, что выровненный по табам код Q>1) расползается к чертям, если установлен другой размер табуляции;
подобная аргументировка ведет к флэйму, поэтому опустим ее, если не возражаешь...
Q>2) трудно поддаётся модификации из-за необходимости поддерживать выравнивание.
выравнивание чего? разве static_cast<...>() создан не для этого? речь, ведь, не идет о выравнивании как в этом посте — http://www.rsdn.ru/forum/message/2842291.1.aspx
Q>А так код вполне нормальный, гуглить надо по запросам «CRTP», «Couriosly Recurring Template Pattern», плюс посмотреть в книжке Вандевурда, там тоже есть описание. CRTP является статическим аналогом паттерна Template Method.
Уже смотрел... Хотелось узнать кто и как реализует дизайн классов в своих, промышленного типа, библиотеках.
Перелапатил кучу литературы и так и не смог определиться какой создать дизайн библиотеки. Реализовывать ли ее через идиому "является частью" или же "реализован как". Вот главный вопрос данного поста!
Конечно же, я понимаю, что все зависит от частностей. Поэтому хотелось услышать аргументы в пользу той или иной идиомы, именно в сфере промышленной разработки библиотеки. Каковы были предпосылки к выбору дизайна классов?
Здравствуйте, Аноним, Вы писали:
А>подобная аргументировка ведет к флэйму, поэтому опустим ее, если не возражаешь...
Не-не, не возражаю!
А>выравнивание чего?
Я имел в виду в этом смысле.
А>Конечно же, я понимаю, что все зависит от частностей. Поэтому хотелось услышать аргументы в пользу той или иной идиомы, именно в сфере промышленной разработки библиотеки. Каковы были предпосылки к выбору дизайна классов?
CRTP — это скорее не дизайн классов, а приём, паттерн. Некоторые use cases перечислены в одном старом блоге.
Мне очень редко приходилось пользоваться таким паттерном, раза три всего.
А>Уже смотрел... Хотелось узнать кто и как реализует дизайн классов в своих, промышленного типа, библиотеках.
Ну, в Boost CRTP используется очень широко. Но этот паттерн больше нужен библиотекописателям, реже прикладникам.
Q>Мне очень редко приходилось пользоваться таким паттерном, раза три всего.
Имеется в виду, редко приходилось реализовывать. А пользоваться приходится чаще, в рамках использования Boost и Loki.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: static_cast<final_class*>(this)
От:
Аноним
Дата:
18.02.08 13:44
Оценка:
Здравствуйте, Qbit86, Вы писали:
Q>>Мне очень редко приходилось пользоваться таким паттерном, раза три всего.
Q>Имеется в виду, редко приходилось реализовывать. А пользоваться приходится чаще, в рамках использования Boost и Loki.
Парадокс заключается в том, что Саттер и Мейерс рекомендуют использовать идиому "реализован как", а Александреску просто добивает своим SmartPtr сомневающихся в этом. Вместе с этим, паттерн CRTP широко используется в таких библиотеках как WTL(практически повсеместно) и stl(в меньшей степени).
Re: вопрос к знатокам от телезрителей
От:
Аноним
Дата:
18.02.08 14:36
Оценка:
во что выливается, с точки зрения производительности, вызов функций Foo, на том или ином компиляторе(в большей степени меня интересует EVC4, CodeWarrior for Symbian OS, VC6.0-8.0):
struct base
{
void BaseFoo(void) { }
};
template < typename FinalClass >
struct impl
{
void Foo(void)
{ static_cast<FinalClass*>(this)->BaseFoo(); }
};
struct final : public base, public impl< final >
{
};
struct base
{
};
template < typename Base >
struct impl
{
static void Foo(Base* pBase) { }
};
template < typename Impl >
struct final : public base
{
void Foo(void) { Impl::Foo(this); }
};
struct base
{
void Foo(void) { }
};
template < typename Base >
struct final
{
Base* pBase;
void Foo(void) { pBase->Foo(this); }
};
Здравствуйте, Аноним, Вы писали:
A>Реализовывать ли ее через идиому "является частью" или же "реализован как". Вот главный вопрос данного поста!
Это скорее ортогональные, а не взаимоисключающие понятия. «Реализован посредством» (IIITO — is implemented in terms of) может быть воплощён через «содержит» или через приватное наследование.
А>Парадокс заключается в том, что Саттер и Мейерс рекомендуют использовать идиому "реализован как", а Александреску просто добивает своим SmartPtr сомневающихся в этом. Вместе с этим, паттерн CRTP широко используется в таких библиотеках как WTL(практически повсеместно) и stl(в меньшей степени).
Никакого парадокса нет. Не стоит рассматривать публичное наследование при реализации CRTP как попирание принципа «Предпочитайте композицию наследованию при отношении IIITO». Просто паттерн такой.
проблемы msvc7.1 в некоторых случаях совмещения шаблонных классов в одной иерархии множественным наследованием
так глубоко пока еще не копал(требования к библиотеке таковы, что необходимо создать терминальные классы, пока)...
так, что пост уже настораживает, относительно применения CRTP///
Спасибо!