Здравствуйте, alexeiz, Вы писали:
Д>>4. Замыканий
A>Функторы.
Бред. Вот пара примеров навскидку:
Придуманный:
def MakeInvertedPredicate(p) { fun(x) { !p(x) } }
Как это реализовать на С++? Знаю что можно, да думать лень, когда уже повсюду реализованы нормальные средства.
Реальный:
def Sort(item : int, reverse : bool) : void
{
def pred(av, bv) : bool
{
def (a, b) = if (reverse) (bv, av) else (av, bv);
some_natural_order_string_compare(a[item], b[item]) < 0
}
some_standart_sort(m_data.begin(), m_data.end(), pred)
}
А как это делается на С++? Обрати внимание на необходимость вручную передать члены класса, скопировать в конструкторе...
void Sort(int item, bool reverse)
{
struct Pred
{
int m_nItem;
bool m_reverse;
Pred(int nItem, bool rev) : m_nItem(nItem), m_reverse(rev) {}
bool operator()(std::vector<CString> const& av, std::vector<CString> const& bv)
{
CString const& a = (m_reverse ? bv : av)[m_nItem];
CString const& b = (m_reverse ? av : bv)[m_nItem];
return strnatcasecmp(a, b) < 0;
}
};
std::sort(m_data.begin(), m_data.end(), Pred(item, reverse));
}
Надеюсь не надо пояснять, что будет, если таких передаваемых параметров будет 8-10? А что если в их числе должны будут быть другие предикаты (которые могут быть статическими функциями или членами классов), которым тоже надо что-то передать?
Ты можешь сказать, что у тебя таких ситуаций не было. А почему не было? Потому что тебе не приходило в голову, что так можно, исключительно из-за того, что на С++ это делать трудно и результат получается непонятным. Вот тебе косвенный показатель "высокости уровня": на каждом "уровне" свои проблемы. Например, трудно представить программиста на Си, перетряхивающего большую иерархию классов
Наличие замыканий — это дополнительный уровень абстракции. Недавно всплывали числа Черча — чем не абстракция? На С++ эта абстракция недоступна.
Д>>5. Уверенности в том, что безобидный на вид код не окажется злостным UB
A>Не замечено. Давай ты приведёшь пример well-formed C++ кода, использующего высокоуровневые абстракции, в котором тебя ждут упомянутые тобой проблемы.
Не раз в форуме C++ были темы с безобидной функцией, в которой находили до десятка потенциальных проблем. Проблема как раз в выделенном — трудно сразу сказать, является код ill-formed, или это well-formed с UB, или всё правильно. К примеру:
struct A
{
T* x, y;
A() : x (new T), y (new T) {}
};
Д>>2. Необходимость писать килограммы оберток каждый раз, когда тебе нужно использовать чужую библиотеку (см п.1 и п.2)
A>Проблемы библиотек. Объясни мне, как херовые сторонние библиотеки вдруг стали проблемой языка?
Всегда были. Я тебе продемонстрировал

Такие мелочи, когда из-за недостатка фич в языке неожиданно приходится писать какую-то муть, в совокупности заставляют отказаться от некоторых выгодных стилей программирования. Например, мне бы хотелось услышать, как ты объяснишь новичку в С++ (умеющему создать вектор чисел и отсортировать) приведенную реализацию Sort, зачем там ещё класс, почему так? Или может приведёшь более понятную реализацию (отсортировать два двухмерных массива (jagged) по заданному номеру столбца, опционально с инверсией)?
Д>>3. Заботливо разложенные на каждом шагу грабли, в качестве ярких примеров — vector<bool>, auto_ptr в котейнерах, и прочие радости.
A>Эти грабли хорошо изветсны и никакой опасности не представляют.
Про массив auto_ptr все знают. Везде написано. А вот про это — не везде:
void foo(auto_ptr<T> param)
{
}
A>Все твои "аргументы" даже и на йоту не ближе к тому, чтобы показать, что на С++ нельзя программировать на высоком уровне абстракции.
Насколько высоком? Более высоком, чем на Си? Да. На не менее высоком, чем позволяет любой другой существующий язык? Увы, нет.
Факт в том, что в других языках есть нужные и полезные возможности, которых в С++ нет. Следующий стандарт готовят через несколько лет и там их тоже нет. Это возможности вроде замыканий или макросов, которые средствами языка, без привлечения дополнительного препроцессора, реализовать в принципе никак. В редких случаях возможны извраты (благодаря которым переменные приходится объявлять как DECLARE(int, x) и т.п.), дающие некое подобие.