Здравствуйте, Erop, Вы писали:
E>Здравствуйте, remark, Вы писали:
R>>"Навёрнутые" или не "навёрнутые" — это субъективное мнение. Мне сейчас это не кажется навёрнутым. Просто другая форма записи тем же самых вещей. Не вижу никакой принципиальной разницы между включением нескольких указателей на динамические интерфейсы или включением нескольких указателей на статические интерффейсы. Синтаксис немного другой. Да, у шаблонов синтаксис порядочно сложнее, с этим согласен. Вначале снепривычки было сложно, но сейчас практически одинаково.
E>У шаблонов есть много "преимуществ"
E>1) Намного хуже, чем в случае интерфейсов заданы правила использования. В результате грамотный шаблон написать труднее (больше надо всегопредусмотреть), и воспользоваться труднее (надо выбрать из большего числа мыслемыз альтернативных способов использования)
Ничто не мешает задать их так же явно. Например так:
//Класс TLog должен быть copy-constructable и иметь следующий интерфейс:
struct TLog
{
void log(const std::string&);
int fff();
};
В следующей версии стандарта языка эту проблему возможно решат более элегантно.
Зато и возможностей больше. Гораздо больше. Причём принципиально новых. Вспомни хотя бы std::vector<>! Как ты его предлагаешь реализовывать без шаблонов? Или ты его не используешь?
E>2) Намного более сложный синтаксис и семантика. Вот, например, что тут написано:
E>E>template<typename TLog>
E>class Base {
E>protected
E> void exit( int );
E>};
E>template<typename TLog>
E>class MyExitProicessor : public Base<TLog> {
E>public:
E> void OnExit( TLog& log, int code )
E> {
E> LogExit( log, code ); // это какой-то метод MyExitProicessor, описанный ниже
E> exit( code );
E> }
E>};
E>
Имхо. Всё понятно. Кстати, лучше писать "this->LogExit()" и "this->exit()", тогда и понятнее будет.
E>3) Очень неудобные сообщения об ошибках в пользовательском коде.
В большинстве случаев точно такие же как и без шаблонов. Надо просто их внимательно прочитать, а не говорить сразу "ух ты #$%, я это даже читать не буду". Вот ещё
здесь.
E>А вот реальные приимущества всех этих трюков Александреску они в чём?
Меньше дублирования. Лучше понятны намерения программиста. Аспекты лучше выделены, а не замешаны в один клубок. Но это всё достигается за счёт наличия более сложного (интеллектуального) кода.
Я так считаю: можно иметь или много "тупого" кода (я его называю "raw"), это когда много накопипастеных функций, или меньше кода, но более "интеллектуального".
Кстати, можно узнать про твоё отношение к исключениям. Ты их используешь в с++?