классы обычно объявляются как
class name {
object name1;
object name2;
etc
}
а что значит
такое объявление:
template <class X>
class Singleton : public X {
public:
static Singleton<X>& get() {
static Singleton<X> instance;
return instance;
}
private:
Singleton() : X() {};
Singleton(const Singleton&);
};
интересует вот эта строчка " class Singleton : public X {"
остальной код для полноты
25 февраля 2010 в 22:01
спасибо
25 февраля 2010 в 17:00
>Да и главное очень трудно поддерживать код. Нет в шаблонах С++ такой элегантности как в том же Хаскеле, получается огород из темплейтов в которой не то что командной разработке… самому даже толком не разобраться иногда что написал.
На счет плохой поддерживаемости не соглашусь, как и на счет того, что не разобраться. Просто код надо нормальный писать.
25 февраля 2010 в 16:04
а можно ссылку на банду четырех?)
25 февраля 2010 в 16:04
Николай Митропольский, почитал про Хаскель, Лисп. Понравилось, тем более, что есть такая библиотечка, как InteLib, которая предоставляет нам возможность использовать ряд функциональных языков в почти что полном объеме прямо в С++. Реализовна как раз на шаблонах. Минус большой, при ошибке в синтаксисе функционального языка мы получаем столько шаблонногоБреда от компилятора, что жесть.
>Вы осилили буст и решили этим похвастаться? ))
буст до конца не осилил, там же более 80 компонентов! Что-то использовал, что-то нет.
>Но еще раз хочу сказать все это несколько далеко от реальности.
Соглашусь в том смысле, что редко это где применяется. Не пойдешь устраивать на работу, навязывая свои template подходы.
25 февраля 2010 в 16:04
Александр ev Новиков,
Вам в каком виде?
//www.ozon.ru/context/detail/id/2457392/
сойдет?
25 февраля 2010 в 16:04
> а можно ссылку на банду четырех?)
//www.rsdn.ru/res/book/oo/design_patterns.xml
25 февраля 2010 в 16:04
> Не пойдешь устраивать на работу, навязывая свои template подходы.
Да и главное очень трудно поддерживать код. Нет в шаблонах С++ такой элегантности как в том же Хаскеле, получается огород из темплейтов в которой не то что командной разработке…самому даже толком не разобраться иногда что написал.
25 февраля 2010 в 16:03
Дмитрий Иванов, эк вас понесло.
Вы осилили буст и решили этим похвастаться? ))
Круто) могу посоветовать почитать про Хаскель – вам должно понравиться)
Но еще раз хочу сказать все это несколько далеко от реальности.
25 февраля 2010 в 13:01
>А огромный свитч.. я хоть и далек от с++ но помоему смысл хорошего тона сводится именно к тому, что бы не было этого огромного свитча или кучи операторов иф элс, а было ооп и полиморфизм.
Я и не говорю, что так ВСЕГДА надо делать. Замечу, что мегасвитч вполне можно написать всего один для всего семейства классов и работает такой вариант значительно быстрее… Что касается блоков if else, то они при большом колчестве смежных вариант работают медленнее мегасвитча.
Что касается хорошего тона. В каких используемых ныне языках, кроме С++, есть шаблоны. Недалекие программисты предложат мне generic'и в паре известных языков. Но это же совсем разные вещи!
А раз шаблоны есть только в С++, то очевидно, что в общих правилах хорошего тона они не могут быть описаны.
Что же касается идей Александреску, то я отчасти соглашусь с "Александр ev Новиков". Стандартные паттерны лучше почитать в другой книге, скажем, в банде четырех. Нестандартные штуки, скажем контейнеров для типов на этапе компиляции, у того реализованы часто на макросах, а не на шаблонах. Учитывая, что макросы подставляются ДО компиляции, в шаблоны во время, получается не очень хорошо… А реализация идей Александреску в более потребном виде есть в многочисленных компонентах буста, я их уже перечислил.
25 февраля 2010 в 9:04
вообще не понимаю причем тут александреску с его дизайном… причем тут буст. точно так же можно приплести сюда stl.
А огромный свитч.. я хоть и далек от с++ но помоему смысл хорошего тона сводится именно к тому, что бы не было этого огромного свитча или кучи операторов иф элс, а было ооп и полиморфизм.
да и вообще посмотрите год издания александрески, современным его уже никак не назовешь, но идеи там есть, помимо стандартных шаблонов – тех же синглетонов, декораторов и прочих
25 февраля 2010 в 3:03
Вообще, я уже полгода как подсел на метапрограмминг и пока имею вот какие плюшки:
Первая плюшка:
Есть большая информационная система из кучи плагинов, каждый из который выполняет свои функции. Так вот оказалось, что для каждого плагина вполне достаточно описать структуры данных, а обработка этих структур выпоняется автоматически. Если бьть точным, то автоматически генерируется код за счет использования templates и программист его не видит, что не мешает его отлаживать.
Автоматически обрабатывается ряд типовых операций. Что характерно, классы в плагине в качестве полей могут также иметь нетривиальные классы, но обработка все равно происходит автоматически.
Вся эта идея отчасти напонимает шаблонную сериализацию в бусте. В начале я и написал свои сериализаторы… А потом оказалось что и автоматическая обработка типовых операций тоже несложна.
Вторая плюшка:
Сериализация вначале происходила в xml, потом была дописана в бинарный формат и в запросы СУБД. А потом было немного подумано, и добавлены сериализаторы еще в html+javascript.
В качестве третьей плюшки скажу, что несложной оказалось реализация таблицы в С++, которую можно индексировать разными способами (хэш, бинарное балансированное дерево) по разным полям или их комбинации.
К примеру, пусть есть
class foo1
class foo2
{
DWORD dwTraffic;
foo1 field;
Stringname;
…
};
Так вот, таблица объявляться будет так
Table<foo2> table;
У класса foo2 подразумевается объявленным и описанным метод template<typename Handler> static VOID IndexCreate(Handler& handler)
{
handler.CreateIndex<Тип_индексирования>(поле_или_комбинация_полей);
и так столько индексов, сколько нужно.
}
Вообще примеров можно привести уйму.
Очень много литературы по теме на английском языке, причем достаточно современной, в отличии от первооткрывателя Александреску.
Скажем, можно посмотреть работы Гуртового (Alex Gurtovoy).
25 февраля 2010 в 3:02
Если в кратце, то метапрограммирование(я сейчас имею ввиду только шаблоны) по сути, предоставляет примерно те же возможности, что и ООП, только работает быстрее.
Да-да, виртуальные функции можно заменить одним большим мегасвитчем. Подчеркиваю, ОДНИМ для описываемого семейства типов.
Безусловно, это не значит, что надо отказываться от ООП. Часто ОПП проще в обращении и почти не проигрывает во времени. Но в моей практике встречались случаи, когда способы Александреску оказывались гибче в использовании.
Собственно, основными его идеями является вот это:
template<DWORD value> struct Int2Type
{
enum {Type = value };
};
template<typename ValueType> struct Type2Type
{
typedef ValueType Type;
};
Остальное у него реализовано явно не в лучшей форме. Если эта тема оказалось интересной, то лучше обратиться к описанным выше компонентам буста и посмотреть их реализацию.
Что касается вспомогательных ресурсов по метапрограммированию, то можно глянуть solarix.ru там не мало уделено вниманию этому вопросу.
25 февраля 2010 в 3:00
>Но идеи Александреску для С++ по большей части выглядят как костыли, реальной свободы обобщенного программирования всеравно не ощутишь, да и не юзают её особо в С++. Не воспринимайте Александресу очень серьёзно, его "современный дизайн" довольно далёк от реального современного дизайна – всё в С++ куда прозаичнее и неудобнее.
В Boost перешли многие идеи Александреску, а Boost используется программистами С++ гораздо чаще, чем сама билиотека loki, что написал Александреску и, что представлена у него в книге.
Недоброжелатели сразу попросят привести примера острого Александрескита в бусте. Так вот, концептуально очень похожи несколько подбиблиотек метапрограммирования:
Template Metaprogramming
* Function Types: Boost.FunctionTypes provides functionality to classify, decompose and synthesize function, function pointer, function reference and pointer to member types.
* Fusion: Library for working with tuples, including various containers, algorithms, etc.
* MPL: The Boost.MPL library is a general-purpose, high-level C++ template metaprogramming framework of compile-time algorithms, sequences and metafunctions. It provides a conceptual foundation and an extensive set of powerful and coherent tools that make doing explict metaprogramming in C++ as easy and enjoyable as possible within the current language.
* Proto: Expression template library and compiler construction toolkit for domain-specific embedded languages.
* Static Assert: Static assertions (compile time assertions).
* Type Traits: Templates for fundamental properties of types.
Preprocessor Metaprogramming
* Preprocessor: Preprocessor metaprogramming tools including repetition and recursion.
Для многих других компонентов буста также используются подходы, описанные в Александреску.
Следует также отметить, что в книге Александреску есть много материала не по метапрограммированию, например, аллокатор для маленьких объектов. Оказывается, что Александреску не в теме метапрограммирования не является лучшим специалистом, потому читать неМетаПрограммирование в его книге не рекомендую.
25 февраля 2010 в 0:02
Ну вообще конечно шаблонный класс у которого параметризуется предок – это вам не хухры-мухры, жава-программисту такое в голову бы не пришло. Александреску хорош в плане расширения сознания в области обобщенного программирования, в жаве с её недогенериками такого не сделаешь.
Но идеи Александреску для С++ по большей части выглядят как костыли, реальной свободы обобщенного программирования всеравно не ощутишь, да и не юзают её особо в С++. Не воспринимайте Александресу очень серьёзно, его "современный дизайн" довольно далёк от реального современного дизайна – всё в С++ куда прозаичнее и неудобнее.
24 февраля 2010 в 23:05
это паттерн из Александреску "Современный дизайн с++"
яву знаю, решил наверстывать забытое со 2ого курса по с++, тяжело)) столько разных фич ложится на плечи программиста,о которых в яве привык не думать вообще))
24 февраля 2010 в 22:05
Константин Конашенков,
Вот я не понимаю… код предоставлен – неужели вы сами не можете ответить себе на вопрос паттерн это или не паттерн?
24 февраля 2010 в 22:05
Да, надо было смайл ставить. Дело в том, что в Java Singleton – такой паттерн
24 февраля 2010 в 22:05
Синглтон что в жаве, что ни в жаве – это синглтон. Да, его принято считать паттерном.
Другой вопрос чтов жаве он будет выглядеть подругому.
24 февраля 2010 в 22:05
Говорил, про само название, а не реалиацию
24 февраля 2010 в 22:03
Singleton а это случаем не паттерны пошли ?
24 февраля 2010 в 21:04
ой блин.. вот это я ламер)))) привык, что в яве надо писать extends ))
24 февраля 2010 в 21:03
Наследование
//ru.wikipedia.org/wiki/Наследование_(программи...