Re[56]: C+ vs C#
От: Кодёнок  
Дата: 13.02.06 12:51
Оценка: 3 (2) +2
Здравствуйте, 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) и т.п.), дающие некое подобие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.