Я тебя не удевлю если скажу, что все это можно сделать и на Шарпе (т.е. без шаблонов)? Причем решения будут даже более красивыми.
Так что твои примеры скорее являются доказательством высказанной мною мысли, о том что 90% использования шаблонов в С++ является затыканием дырок языка. И вызваны прощетами в языке.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
PE>>3. Это же означает, что не только новичек, но и середнячек не потянет все рулезы концентрированного С++. WH>Если человек хочет его можно дотяуть до этого уровня очень быстро.
Ага годика за 3 минимум.
PE>>Такая техника сродни уровню гросстмейстера мирового класса в шахматах — их очень мало. WH>Лесть тебя не спасет.
Это стеб.
PE>>4. Я не вижу отражения существующих тенденций — компонентное программирование и тд. PE>>__declspec(__dllexport) — это далеко не то, что надо сейчас. WH>Согласен. Но во первых и на этом можно очень много, во вторых есть много задачь где это не актуально.
Вот С++ скоро и останется в нишах где "это" не актуально. А реально он останется в области низкоуровневого программирования.
WH>Ну сериализация очень практична,
Ага. Особенно по сравнению с дотнетной.
WH> SWL это потенциально очень мощьная, гибкая и лаконичная оконная библиотека только надо комуто ее написать.
Я бы сказал не некому, а никому на фиг не нужно. Все равно до приметивной WinForms ей будет, как раку до Пекина.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, alexkro, Вы писали:
A>Многогранен — это точно. Но что значит "только сейчас"? Книга написана в 2001-м, некоторые идеи (например, static_checker<> — так его раньше Александреску называл) были у него уже опубликованы в 1999-м. Про Typelist он тоже в 1999-м проговорился. Все это — почти сразу после принятия стандарта.
Ты помнишь когда появился С++? Я вот 10 лет назад его изучал. А многие приколы с шаблонами только пару месяцев назад стало возможно скомпилировать на одном из самых популярных из компиляторв (VC).
A>Что-ж, многие еще до сих пор не знают, что такое "using namespace std". Разве это о чем-либо говорит? Просто люди когда-то научились программировать на C++ (на самом деле на C with classes), и с тех пор им было пофиг свои знания обновить.
Говорит... Хотя бы о том, что для того чтобы воспользоваться приметивными вещами приходится заниматься серьезным изучением по сути никому не интересных вещей. Короче, все тоже самое можно сделать куда проще и практически без потерь.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
WH>А что тут разбираться это просто пример того как можно написать несколько стандартных кирпичиков, а потом из них собирать классы. WH>А как на C# можно из стандартных кирпичиков собирать классы?
Да! Ну ты крут. Тебе явно нужно отходить от плюсво. А то даже такую простую вещь как множественное наследавание ты превращаешь в страшного монстра на шаблонах.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
VD>>Я честно говря вижу только проблему которую возможно помогут обойти шалоны. Это как не странно отсуствие множественного наследования (МН). Мне лично МН нужно только для подключения к классам готовых реализаций.
M>В принципе, решаемо с помощью Reflection.Emit.
Мне не нужно "в принципе". Мне нужно просто, удобно и быстро. В С++ я делал примерно так:
C1<class Base>
{
void Method1()
{
// Море кода...
Base * pBase = (Base *)this;
int i = pBase->SomeUniversalWork();
// Еще поре кода использующее значение i...
}
int SomeUniversalWork(){ return 0; }
};
С2 : public C1<C2>
{
// Методы класса C2.int SomeUniversalWork()
{
return m_x / m_y; // В общем любые вычисления...
}
};
С3 : public C1<C2>
{
// Методы класса C2.int SomeUniversalWork()
{
return m_x * m_y; // В общем любые другие вычисления...
}
};
Короче, я легко создавал базовые реализации и даже взаимодействовал с классом насдедником. При этом мне даже были ненужны виртуальные методы (ведь еще на этапе компиляции 100%-но известно метод какого класса будет вызыван.
Если использовать виртуальные методы, то и шаблонов будет не нужно:
C1
{
void Method1()
{
// Море кода...int i = SomeUniversalWork();
// Еще поре кода использующее значение i...
}
virtual int SomeUniversalWork() = 0;
};
С2 : public C1
{
// Методы класса C2.int SomeUniversalWork()
{
return m_x / m_y; // В общем любые вычисления...
}
};
С3 : public C1
{
// Методы класса C2.int SomeUniversalWork()
{
return m_x * m_y; // В общем любые другие вычисления...
}
};
Короче, просто, удобно и быстро. Причем быстро, как с точки зрения написания, так и выполнения (при условии наличия хорошего оптимизирующего компилятора).
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, desperado_gmbh, Вы писали:
_>Конечно, поддерживается. И поддержка логично разделена на несколько частей — в bcl сам MulticastDelegate, в vm — магия, а компилятор генерит обертку над MulticastDelegate, подставляя туда параметры метода. И вдруг появляются generics, которые именно для того вроде и нужны, чтобы подставлять в шаблоны конкретные типы, но делегаты уже сделаны без них. Неортогональный дизайн
Нормальный дизай. Шаблоны делают не тоже самое что делегаты. Более того, на С++ нужно вывернуться на изнанку, чтобы на шаблонах сэмулировать делегаты. И даже с этими вывертами они являются обманом времени компиляции и непригодны когда нужно рантайм-решение.
Если шаблоны в шарпе сделают как следует, то скорее всего можно будет определять параметры делегатов как шаблонные типы. Это несомненно усилит возможности делегатов.
_>Вызовы методов из другого домена, процесса, машины в дотнете тоже типизированные и прозрачные, но это не повод говорить, что в c++ нельзя создать полноценную замену методам.
Каким методам? Делегатам видимо... Дык можно. Вот посмотри на КОМ и КОРБУ. Прекрасные доказательства того, что это кривой путь.
_>Если не доходить до утверждений, что на c++ нет даже классов и методов, потому что нет рефлексии и сериализации, то чего из делегатов не хватает в сигналах?
Ну, про отсуствие классов и методов — это ты конечно сам придумал. А вто отсуствие полноценного рантайма конечно явно отсуствует.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Да у меня нет вопросов. Мое знание С++ позволяет применять его для решения нужных мне задачь и чтения чужого кода. Я не фанат этого языка и оттачивать свое мастерство в нем не жалаю.
Моих знаиний более чем достаточно чтобы заметить море мелких и не очень проблем этого языка. И уж точно достаточно, чтобы оценить его приемущества и недостатки по отношению к Шарпу.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Plutonia Experiment, Вы писали:
PE>>>Потому и нежен рефлекшн и тд. Поскольку язык сделан максимально безопастным, делегаты сделаны в нем нативными средсвами. VD>>Рефлешон — это полноценная информация о типах. И то что ее нет в С++ всего лишь вина авторов языка.
PE>Сделать то можно. Но это же громозко. Проще обойти каким другим путем.
Что можно? Ты и я ничего сделать не можем. Разве что внешние тулзы. Тут нужна воля разработчика языка. А громоздкого тут ничего нет. Просто полноценная реализация.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
VD>>А. Ну-ну. Интересно как я погу знать о таких вещах даже не пробовав? WH>А что ты хотел? boost _бесплатная, эксперементальная_ библиотека. WH>Там просто мелкий недочет который можно исправить за пару часов.
И вот в чем засада. Нет ни одной библиотеки делающая тоже самое что делегаты. Разве что DCOM или CORBA использовать. Но это уже будет не языковое решение и уж точно не такое локоничное, как сигналы.
Ну, а хотеб бы я чтобы страуструп перестал впадать в старческий маразм и понял, что нужно принимать новое и расширять язык. Или придумывать средства расширения языка более действенные чем шаблоны. Правда тогда это уже будет конструктор. Нечто вроде PL1.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
VD>>Да я вроде и без него в С++ разбирался. WH>Я тоже так думал...
WH>Из предисловия Скотта Мейерса WH>
WH>Если, прочитав материал, посвященный спискам типов, вы не свалились со стула, значит, вы сидели на полу.
Вот что-что а я бы посоветовал Владу глянуть всё таки эту книжку ... Там есть над чем посмеяться, самые очевидные вещи решаются такими уродскими способами (реализация, а не задумка ) и всё это подаётся под таким соусом, как откровение ...
Правда до главы со списками я ещё не дошёл, но эта книжка прекрасный повод для критики С++ ... Язык морально устаревает и люди вроде Александреску пытаются показать, что на С++ можно делать и кое-что новое, что в том же Шарпе делается просто и лаконично ...
А самое главное, что важно для программиста это ну очень трудное чтение исходников, потому что оно неочевидное. Простые вещи скрываются под таким набором конструкций в которых в жисть эту вещь не узнаешь. В голову приходит только одна аналогия (особенно связанная с форматированием исходников — когда темплейтные определения разносят по строчкам) — ассемблер нашего века.
WH>Со стула я не свалился но долго был в шоке.
Посмотрим, посмотрим ... но подозрения, что там наворотили уже есть особенно после темплейта Type2Type.
Здравствуйте, AndrewVK, Вы писали:
AVK>Ты путаешь причину со следствием — указатель на функцию это уже следствие. Главная обязанность делегата — обеспечить типизированный колбек. Ровно то же можно сделать используя интерфейсы, что с успехом демонстрирует тот же свинг, да и в дотнете кое где встречается. Просто интерфейсы не очень удобны, поскольку приходится описывать отдельный класс. Вот для упрощения и вводится указатель на член класса или делегат. С такой точки зрения бустовский signal выглядит несколько ущербно, не согласен?
Нет. Сигналы как раз и есть эмуляция делегатов. Своеобразная, но эмуляция. Проблема в том как это сделано! Это форменное удаление гланд через анус автогеном. И очередная демострация затыкания ущербности языка средствами использования шаблонов не по назначению. Виртуожно? Бесспорно! Бред? Несомненно! По сути делегат (если отбросить его компонентную природу в дотнете) является указателем на метод экземпляра.
По сути делегаты — это ОО-указатели на фнукции из С++. Т.е. теже средства колбэка, но объектноориентированные.
Аналога в С++ нет. Вместо него был введен уродливый и плохо применимый указатель на функцию класса. Надеюсь понятно почему данные слова выделены?
Так вот в бусте создана целая гора кода, чтобы сэмулировать такое простое решение. Если в С++ наплевать на типобезопастность, но написать такую фитюльку ничего не стоит.
Так что сигналы являются прекрасным подрверждением того, что с одной стороны С++ великий язык позвляющий творить казалось бы невозможное (с саим собой), но с другой — это устаревший и ущербный язык в котором для реализации минимальных удобств нужно молотить горы кода.
Можно взразить, но ведь на сегодня эти гору за частую написаны! Да. Но во что это выливается? На любой плевок нужно создать целый отдельный класс! Это приводить к неимоверным затратам времени на компиляцию. Один из наших проектов компилируется 25 минут на Атлон 1400! И это как раз в основном из-за шаблонов. Причем наши шаблоны бустовским не чета.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, WolfHound, Вы писали:
WH>>А тебе не кажется что если бы разговор шол о просто коллекциях то Мейерс бы не свалился со стула?
VD>А мне все равно. Короче, мой вопрос остался без ответа.
Это коллекции типов. Причем работа с ними идет во время компиляции.
Здравствуйте, VladD2, Вы писали:
AVK>>В них нет определенного функционала темплейтов,
VD>Можно узнать какого?
Ссылку на whitepaper с описанием изменений языка в .NET 2.0 давали неоднократно, различиям темплейтов и дженериков там посвящена отдельная глава.
AVK>>И еще, писать на дотнете, так как ты это делал на С++ не стоит, ничего хорошего из этого не выдет. Другая идеология, другие паттерны.
VD>Ну, ну. Это уже ты загнул. Писать можно так же.
Можно, вот только результатом этого как раз и являются вопли о неправильности шарпа.
Здравствуйте, VladD2, Вы писали:
VD>Все до одной. Другой вопрос что этот менеджед-код не будет совместим с CLS.
Да? И ты берешься сделать к примеру класс с МН менеджед? Не путай пожалуйста IL-код и-managed код. Когда ты объявляешь класс gc то очень многие фичи становяться недоступны.
Здравствуйте, VladD2, Вы писали:
VD>Я тебя не удевлю если скажу, что все это можно сделать и на Шарпе (т.е. без шаблонов)? Причем решения будут даже более красивыми.
VD>Так что твои примеры скорее являются доказательством высказанной мною мысли, о том что 90% использования шаблонов в С++ является затыканием дырок языка. И вызваны прощетами в языке.
Я обычно в таких случаях предлагаю реализовать аналог конфигуратора януса . Исходники есть, даже статья есть.
IT> using (SqlConnection con = new SqlConnection(connectionString))
IT> {
IT> con.Open();
IT> using (SqlCommand cmd = new SqlCommand(commandText, con))
IT>
Двойка тебе за знание адонета . Чтобы создать команду нет необходимости открывать коннекшен, открывать нужно только для Execute, Prepare и BeginTransaction.
IT>Для меня эталоном программы уже давно является не виртуозное владение указателями, свитчами и шаблонами, а ясный и понятный, хорошо оформленный и откомментированный код. Впрочем, может это я просто старею...
Здравствуйте, WolfHound, Вы писали:
AVK>>Просто чтобы прочитать такой объем исходников нужно немалое время. Я тебе могу тоже сейчас из януса кинуть кусок исходников большого объема и попросить реализовать это на С++. WH>Если бы ты потратил хотябы минуту то понял бы что там все повторяется и разобрался бы за следующие 2 мнуты.
Ну уж нет. По сравнению с исходниками на шарпе это жутко непонятная каша.
AVK>>Что значит из стандартных кирпичиков? Ты имеешь ввиду подключение реализаций? Пример того как это реализовать я приводил в форуме по дотнету. WH>Вобщем да. А ссылку можно?
Нету ее у меня. Поищи в поиске.
WH> Хотя у меня функциональность по больше в моем варианте один кирпичик может изменять дугой причем только с использованием полиморфизма времени компиляции те без ущерба производительности.
При желании в том подходе, пример которого приведен можно наворотить такие извратства, что плюсам и не снились, только вот нафик никому это не нужно.