Твой тезис именно в том, что вот какой-то функционал ты объявляешь
априори плохим ссылаясь на свою негативную практику и аппелируешь к
тому, что в "промышленных" ЯВУ (вроде C#) такого функционала нет. В
конце концов раз для тебя плохой -- не пользуйся. Но наличие возможности всегда лучше её отсутствия. В других языках такой возможности нет. Плохая она или хорошая. А
насколько плохая -- очень субъективная оценка. Вот я считаю -- что
хорошая. А твоя негативная практика -- это исключительно твоя практика. У кого-то она есть и положительная. Ты утверждаешь, что мол обобщённый инструмент -- "плохой". А что значит плохой, какие критерии понятия "плохой"? Кто-то пользовался неправильно и получил негативный результат? Это не критерий -- мы не знаем кто пользовался и умел ли он пользоваться вообще.
Говоришь мол обобщённый вариант хуже. Но чем он хуже, если он позволяет программисту создавать новые типы с новыми свойствами наперёд не известными авторам компилятора? Это твоя идея с "компиляторной магией" -- очень плохая. Без кавычек. Потому, что она не позволяет создавать свои типы и нужно идти и дёргать за рукав авторов компилятора, чтоб что-то получилось. Когда в компиляторе для наперёд известных типов сделана масса костылей и подпорок, а сам такого не напишешь (опять же оператор write в pascal). Как раз C++ и примечателен тем, что таких костылей нет, кроме упомянутого initializer_list (но это уж совсем базовый примитив, элемент языка, а не какой-то конретный тип), остальное реализуется посредством метапрограммирования.
Сложная для восприятия? Но какова альтернатива? Ты же не предложишь другую технологию, ты только говоришь, мол эта плохая, а альтернатива -- делайте всё руками совсем уж. И сложная для кого? Опять же очень субъективное понятие. На мой взгляд шаблоны не являются чем-то запредельно сложным -- это такой простенький декларативный язык оперирующий очень ограниченным множеством понятий. Он на самом деле -- простой. Он в голове умещается, как и стандартная C библиотека. А развесистое дерево из классов доступных прикладному программисту в C# -- не умещается, там каждый раз код на неизвестном языке (API не знаешь). На мой взгляд C++ сильно проще чем C#, потому, что его элементарно можно выучить, весь наизусть. А множество классов доступных в C# -- нельзя, оно куда более сложное значит, и документации нихрена нет (формально есть, но по существу -- издевательство). Или некоторые может не понимают принципов функционального или декларативного программирования и любая программа написанная в неимперативном стиле им кажется "сложной". Вот результат субъективной оценки.
Сложно отлаживать -- это что, повод вообще не программировать или вернуться к ассемблеру? И есть, наконец, инструменты, я ссылки давал несколько раз:
http://caxapa.ru/956474
Весь C++, практически всё что за ним стоит, всё связанное с метапрограммированием родилось практически случайно. Не целенаправленно. Создавались изначально совершенно другие вещи, метапрограммирование возникло из простой идеи немного улучшить C-макропроцессор. Но оно работает давно уже на другом уровне и ничего общесто с препроцессором не имеет. И служит другим целям. Отнюдь не специализации контейнеров -- это этап C++99/C++03. И возможно ты застрял в тех же временах, отсюда неприятие и непонимание.
Чем плохо множественное наследование, кроме того, что оно "просто плохо"? Ты никаких доводов почему плохо не приводишь, мол если есть такая функция -- язык плохой. Не нужна, опасна -- не пользуйся. Пиши как на C#, Java и т.п. Кому надо -- воспользуются где надо. Гораздо лучше иметь функционал и не пользоваться, если не нужно, чем не иметь и не иметь возможности воспользоваться.
Если сравнивать с Rust, то там как раз метапрограммирование практически лишено смысла. Система шаблонов в C++ попросту намного функциональней (http://caxapa.ru/983808/), несмотря на то, что создавалась для совершенно другого и сейчас имеет массу рудиментов и плохо приспособлена именно для программирования, а не как "шаблонизатор". На мой взгляд, в связи с чем, мёртворождённый язык. Он принципиально ничем не лучше, а только хуже C++ оказывается. Про использование в embedded лучше видимо вообще забыть.
Я считаю, языки реализующее полноценно метапрограммирование -- это шаг вперёд, в новое измерение, как шаг от ассемблера к C, только дальше. Сейчас таких языков, из широко известных и доступных ровно два: C++ и Common Lisp. А ты говоришь, мол студенты наделают ошибок, давайте вернёмся к паскалю. У каждого своё мнение...