LINUX.ORG.RU

Какое же говнище этот ваш С++

 


11

7

Решил намедни углубить свои знания по плюсам, чувствуя, что скоро нехило так потребуются по работе. Теперь сижу, обмазываюсь тут всякими трупами страусов, Скоттом Майерсом и другими. Г-пди, как же можно на этом писать, особенно после знания божественных лиспов, хаскелей и прочих матанских агд (sic!). Это какая-то пытка, честное слово, мне натурально мерзко и противно читать как люди пытаются вырезать гланды через задний проход да ещё и хвалятся этим, поглядите, мол, как это круто. Такое ощущение, будто плюсисты все поголовно латентные мазохисты.

template <typename T>
class Rational
{
    public:
    ...
    friend const Rational operator*(const Rational& lhs, const Rational& rhs)
    {
        return Rational(lhs.numerator() * rhs.numerator(), // same impl
            lhs.denominator() * rhs.denominator()); // as in Item 24
    }
}

An interesting observation about this technique is that the use of friendship has nothing to do with a need to access non-public parts of the class. In order to make type conversions possible on all arguments, we need a non-member function (Item 24 still applies); and in order to have the proper function automatically instantiated, we need to declare the function inside the class. The only way to declare a non-member function inside a class is to make it a friend. So that's what we do. Unconventional? Yes. Effective? Without a doubt.

Нафиг так жить, почему нельзя всё было сделать по-человечески, как в нормальных языках? Ненавижу страуса, ненавижу плюсы, ненавижу тех идиотов, которые упорно продолжают куда ни попадя совать этот мёртвородженный язычок. И ниасилил, да.

Перемещено mono из talks

★★★★★

Последнее исправление: mono (всего исправлений: 1)

Ответ на: комментарий от r

> > > >

поржем?

Просто великая проблема.

anonymous
()
Ответ на: комментарий от dvl36

Если задача будет требовать, я, например, буду использовать java, хоть опыта у меня с ней немного. Будет тормозить, буду юзать JNI и plain C. И ассемблер буду использовать,в случае необходимости, и Lua, и Фортран. И даже REXX.

Все зависит от задачи. Если у тебя есть требования по памяти, по времени ответа и пр. и пр., то при использовании С++, тебе не придется отказываться от плюшек(в крайнем случае - от RTTI и исключений), переписывать на си или ассемблере. Ты сможешь удовлетворить требования без корявого кода и корявой архитектуры. Для других же задач вполне годны скала, питон и многие другие языки.

forCe
()
Ответ на: комментарий от r

одна из самых больших проблем плюсов как языка высокого уровня в том что там поведение по умолчанию которое на самом деле должно быть опциональным.

Для тех задач, что обычно решаются на С++ все как раз наоборот.

И да, семантика значений(чьим следствием является то самое копирование) - это наследие Си. В С++ лишь добавились ссылки-синонимы, да и то изначально исключительно ради перегрузки операторов. Все остальное, как и в Си, передается по значению. И это логично для ниши.

например STL - просто кладешь туда шопопало - то оно в должно работать максимально эффективно для максимума случаев.

«Кладешь шопопало» это подход быдлокодера. Нормальный программист знает, что и как он использует.

А в плюсах все наизнанку - самая очевидная и простая реализация - нихрена не эффективная.

Это неправда.

Везде где парится бы просто не надо - банально отсортировать или отартировать тот же список - надо парится, а не скопируется ли че нибудь

Ты не понимаешь разницы между семантикой значений и семантикой ссылок? Если есть понимание, то парится не надо.

forCe
()
Ответ на: комментарий от r

Следовательно надо указатели. Следовательно ручное управление памятью.

Ручное управление в С++ - это тебе не в сишечке. Кладешь в вектор unique_ptr, если объекты не шарятся или shared_ptr в противном случае. И все.

forCe
()
Ответ на: комментарий от r

Скала, Хаскел, Ерланг.

Согласен. Только добавляю сюда С++ и Python.

Пока единственный кандидат на замену С++ - это Rust.

forCe
()
Ответ на: комментарий от r

В очередной раз задаю вопрос - что именно и кому облегчает с++? Не в середине 80х не в начале 90х, а сейчас?

Любую задачу, для которой используется Си. И нет, мнение троллей вроде Линуса не интересно.

tailgunner ★★★★★
()
Ответ на: комментарий от qnikst

Это просто следствие способа типизации литералов.


Prelude Data.Ratio> let a = 1 % 2
Prelude Data.Ratio> let b = 3
Prelude Data.Ratio> let c = a * b

<interactive>:5:13:
Couldn't match expected type `Ratio Integer'
with actual type `Integer'
In the second argument of `(*)', namely `b'
In the expression: a * b
In an equation for `c': c = a * b


Можно, конечно, говорить, что какое-то поведение лучше или хуже, но это уже не важно.

Q3164
()
Ответ на: комментарий от tailgunner

мне облегчает например. tinyxml, qt, обертки всякие чтоб реюзать код, всё такое.

весь fglrx на нем написан. писателям дров под макось и офтопик облегчает.

не, я понимаю, что у кретинов вечно возникают проблемы, память отовсюду утекает и всё падает. но при чем тут с++?

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

весь fglrx на нем написан

Кстати, а в fglrx какие фишки Си++ используются - классы, шаблоны, исключения? Какая-нибудь библиотека контейнеров?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

линуксовый драйвер это форк икспишного. в нем местами даже в начале файла в коменте проскакивает «windows xp» вместо онтопика. а там все в ведре работало. поэтому исключений и шаблонов нет, запрещено. библиотек сторонних тоже нет вообще. даже функции __cxa_*** самопальные. классы везде и всюду.

и да, с++ гораздо удобнее голого си, ибо есть наследование и методы с операторами. уже одни они снимают over9000 геморроя.

и да, те же 3д-вычисления на с писать это убиться. у мну есть библиотека использующая sse и neon(написал когда увидел в какое говно компилится eigen). на с писать подобное это убиться об стену. ибо получится не просто нечитаемая лапша, а тормозная лапша: указатели в отличие от ссылок, действуют как volatile - даже в доках gcc есть пример, как превратить обычную переменную в volatile:

int a;

{
   &a; //a is now volatile
   a=a+100;
}

ckotinko ☆☆☆
()
Ответ на: комментарий от r

Какие типы ТЫ сделаешь, такие и будут. Ты — царь и Бог любых типов

Ты что обкурился?

нет. Я же привёл даже пример.

Или какой нибудь гном.

гномоприложения разве без плюсов? Да ну ладно!

Если тебе так нравится эрланг, напиши компилятор эрланга.

На чем на плюсах? Я что раненый?

дык а чего ты хочешь добиться-то? Честно — я не понимаю.

Ты знаешь что такое паттерн матчинг?

Вот только зачем это в C++?

Затем же зачем и везде.

зачем это в твоём «везде», и почему в своём «везде» я без этого обхожусь?

Тебе что показать вагон и маленькую тележку тулкитов не на С++?

ты лучше покажи программы, которые эти твои тулкиты на эрланге юзают.

Это не микроскоп. Это непонятная хрень которая хорошо никакой раобты не делает. В 80х была лучше простого Си для больших проектов. С тех пор осталась как опухоль которую не отрезать и не заменить. Те кто могли бы - попали с ним. Хотя до многихї уже дошло и изобретаю всякие D/Go/Rust.

просто для твоих задач это не нужно. Ну просто возьми, и смирись с этим фактом. Что спорить-то? Да, ДЛЯ ТЕБЯ это ненужная и непонятная хрень. Согласен. Продолжишь мне это доказывать?

И да, быстрее-бы было поднять тему на ЛОРе, в которой спросить: «а правда-ли, что приложение на ФП-бейсике будучи тупо скопировано в C++11+STL будет работать быстрее?». Этим ты-бы сэкономил много времени и нервов. Т.к. проще и спокойней прочитать, как тебя обозвали *удаком, чем доказывать себе, какой ты *удак.

emulek
()
Ответ на: комментарий от ckotinko

и да, те же 3д-вычисления на с писать это убиться.

это потому, что в сишечке попросту нет таких типов данных, и нет никакой возможности их сделать.

emulek
()
Ответ на: комментарий от forCe

и пр. при попытке использовать(эмулировать) их в С не уменьшает сложность, а увеличивает.

При попытке это использовать (например те же исключения) с++ терпит эпик фейл.

При этом в С++ это все применяется достаточно широко

Особенно IoC и DI. Ага-да. Где смотреть промышленные применения?

не вызывает проблем

Особенно исключения из конструкторов или деструкторов....

Ты мог бы сказать, что это не нужно для уровня С/С++,

Я мог бы сказать что все вышеупомянтутое там реализовано настолько хреново что является преймуществом только перед тем где такого нет вообще. А поскольку Си уже занимает весьма узкий скоуп....

А это все крайне уменьшает сложность разработки систем.

В 98 году. Именно так.

r ★★★★★
()
Ответ на: комментарий от tailgunner

Запрет шаблонов выглядит странно.

ничего нет тут странного. Используя шаблоны ты с лёгкостью можешь ТАКОЕ наворотить, что сам Линус не распарсит. В ядре проще их просто запретить. А вот в своём приложении — наворачивай, нет проблем.

emulek
()
Ответ на: комментарий от tailgunner

там много чего странного и не обоснованного. например низя использовать классы-lockerы для мутексов. ынтерпрайз же

ckotinko ☆☆☆
()
Ответ на: комментарий от emulek

Запрет шаблонов выглядит странно.

ничего нет тут странного.

Ваше мнение очень ценно для нас, продолжайте его высказывать.

Используя шаблоны ты с лёгкостью можешь ТАКОЕ наворотить, что сам Линус не распарсит

И Линуса, и Катлера очень, очень заботит код закрытых драйверов NT.

tailgunner ★★★★★
()
Ответ на: комментарий от r

Особенно исключения из конструкторов или деструкторов....

эта проблема идёт ещё с ассемблера. И она до сих пор не решена. В твоих язычках просто заметают мусор под ковёр.

А это все крайне уменьшает сложность разработки систем.

В 98 году. Именно так.

да. Сегодня нет нужды писать ЛОР и фконтакт на C++, ибо есть java и php. И это — хорошо.

emulek
()
Ответ на: комментарий от forCe

Добавь к этому примеры и аргументы.

Зайди в какой нить boost::function и посмотри на эти вырвиглазные потуги эмулировать то что хочется.

r ★★★★★
()
Ответ на: комментарий от emulek

они есть, intrinsics же. но в с++ можно наворотить вокруг него класс и пользоваться нормальными операторами. а в си - макросы и указатели. и чтоб указатели не гадили, везде надо затычки из __restrict делать

ckotinko ☆☆☆
()
Ответ на: комментарий от tailgunner

Используя шаблоны ты с лёгкостью можешь ТАКОЕ наворотить, что сам Линус не распарсит

И Линуса, и Катлера очень, очень заботит код закрытых драйверов NT.

Ну я просто не понял. Вы сейчас NT ядро обсуждаете что-ли? Там тоже нельзя шаблоны, даже в «модулях»?

emulek
()
Ответ на: комментарий от forCe

Какой профит может дать Си, который не дает С++?

Для целей «ассемблерных вставок» в другие системы - отсутствие войны с этим самым с++. А для других целей с++ уже почти на ладан дышит.

r ★★★★★
()
Ответ на: комментарий от ckotinko

а в си - макросы и указатели.

о да... Адъ и Израиль.

emulek
()
Ответ на: комментарий от forCe

Сознательно отказаться может только тот, кто знает то, от чего отказывается. Отказ по причине каких-либо фобий, предубеждений, фапания на Торвальдса и пр. сознательным не является.

Здесь, на ЛОР-е, за последние 2 недели, все причины уже «пережеваны» миллион раз. Да,а про Торвальдса в то время, когда я принимал решение, никто еще и не слышал.

В си этого еще меньше.

Да уж. У всех свои вкусы.

Потрясающие аргументы, показывающие всю глубину осознанности отказа от С++=)

Я не собираюсь повторять по пунктам. То была абстрактная мысль.

dvl36
()
Ответ на: комментарий от r

Все твои посты прямо кричат о том, насколько ты не знаешь предмет, о котором ведешь спор.

anonymous
()
Ответ на: комментарий от r

Это проблема С++, а не Си.

это тебе привет от Страуструпа. Такая его шуточка, обозначить шаблон таким символом, который УЖЕ применяется в сдвоенном виде.

В этой шутке есть доля шутки, учитывая, что в C тоже есть ситуации вроде этой, например x+++++x; Что очевидно неиллюзорно намекает на то, что что-то ты делаешь не так...

emulek
()
Ответ на: комментарий от kamre

Как будто dalvik/webkit/sqlite/... написаны на «ваших бейсиках».

Да вебкит на плюсах лишь по историческим причинам, из-за KHTML, иначе бы и его на obj-c, как и всю огрызочную систему (за исключением ядра, оно на сишке) написали бы.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от wota

т.е отказались от принципа максимального куска? сомневаюсь. скорей всего костыль впилили для таких частных случаев

vvviperrr ★★★★★
()
Ответ на: комментарий от r

В жабе дженерики могут зависеть только от типа, поэтому не может возникнуть ситуации A<n>>2>.

Q3164
()
Ответ на: комментарий от dvl36

А sqlite исходники видел? Там никаких «плюсов» нет.

Знаю, но речь же шла про «эти ваши бейсики». Почему-то взяли быструю C-библиотеку, а не написали на Java (поверх dalvik). На «бейсиках» как уже заметили выше только скриптуется «ядро», где все на C/C++ написано. Для Qt/Quick почти тоже самое предлагается кстати, если нужны свои сложные компоненты - писать на C++.

kamre ★★★
()
Ответ на: комментарий от mix_mix

Да вебкит на плюсах лишь по историческим причинам, из-за KHTML, иначе бы и его на obj-c

или на питоне, если есть цель создать тормозной движок - будет проще реализовать, а все современные (и адекватные) движки на плюсах, т.к. у них цель обратная

wota ★★
()
Ответ на: комментарий от emulek

Ты знаешь что такое паттерн матчинг?

ну то, что ты понимаешь под этим термином я знаю. Вот только зачем это в C++?

Стоп-стоп-стоп. Ты только что же распинался, что в плюсы можно всё, что угодно впилить. Какая разница зачем? Удобно. Ну и где варианты из твоего «как хочешь» по реализации паттерн матчинга, ну так чисто посмотреть, акторов, человеческих замыканий без копирования, зеленых тредов etc. Да даже убогий foreach, которого не было в языке, реализовывали больше десяти лет. Не, ну был, конечно, бустовский на 1128 строк:


#define BOOST_FOREACH(VAR, COL)                                                                                   \
    BOOST_FOREACH_PREAMBLE()                                                                                      \
    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_col) = BOOST_FOREACH_CONTAIN(COL)) {} else   \
    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_cur) = BOOST_FOREACH_BEGIN(COL)) {} else     \
    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_end) = BOOST_FOREACH_END(COL)) {} else       \
    for (bool BOOST_FOREACH_ID(_foreach_continue) = true;                                                         \
              BOOST_FOREACH_ID(_foreach_continue) && !BOOST_FOREACH_DONE(COL);                                    \
              BOOST_FOREACH_ID(_foreach_continue) ? BOOST_FOREACH_NEXT(COL) : (void)0)                            \
        if  (boost::foreach_detail_::set_false(BOOST_FOREACH_ID(_foreach_continue))) {} else                      \
        for (VAR = BOOST_FOREACH_DEREF(COL); !BOOST_FOREACH_ID(_foreach_continue); BOOST_FOREACH_ID(_foreach_continue) = true)
Отличный язык, да!

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

вебкит на плюсах лишь по историческим причинам, из-за KHTML

Ну да, ну да. И JVM с Dalvik были бы на Objective-C, если бы их писали в Яббле %)

ядра, оно на няшной сишке

fixed

tailgunner ★★★★★
()
Ответ на: комментарий от mix_mix

как и всю огрызочную систему (за исключением ядра, оно на сишке)

ЛОЛ, не позорься, С++ есть и в «огрызочной системе» и в ее ядре

wota ★★
()
Ответ на: комментарий от mix_mix

Да даже убогий foreach, которого не было в языке, реализовывали больше десяти лет. Не, ну был, конечно, бустовский на 1128 строк:

и опять не позорься, а посмотри реализацию того же loop в твоем любимом лиспе

wota ★★
()
Ответ на: комментарий от mix_mix

Что не так?

BOOST_FOREACH(item, arr) {
    item->do();
}
anonymous
()
Ответ на: комментарий от wota

ЛОЛ, не позорься, С++ есть и в «огрызочной системе» и в ее ядре

Ага, мелкая-мелкая часть, а в ядре так вообще лишь подмножество Embedded C++.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от wota

и опять не позорься, а посмотри реализацию того же loop в твоем любимом лиспе

Это ты не позорься. Сравнил мне тоже сраный foreach и монструозный eDSL для всего, чего только можно. Я понимаю, если бы ты его ещё с LINQ сравнивал, и то loop бы выиграл.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

Ага, мелкая-мелкая часть

а у тебя есть полный список?

а в ядре так вообще лишь подмножество Embedded C++

по вполне очевидным причинам

wota ★★
()
Ответ на: комментарий от mix_mix

Сравнил мне тоже сраный foreach и монструозный eDSL

и таки первый уже в С++, а второй так и есть - монструозное нечто

wota ★★
()
Ответ на: комментарий от anonymous

Пусть еще монады в хаскелле посмотрит.

А что не так с монадами? Всё очень даже няшно. Это ты бы монады в плюсах посмотрел (как бы они выглядели):

template <template <class...> class>
struct monad;
template <template <class...> class M, typename A, typename F>
auto operator >>=(M<A> const & x, F f) -> decltype(declval<F>()(declval<A>())) {
	return monad<M>::bind(x, f);
};
template <template <class...> class M, typename T>
auto return_(T x) -> M<T> {
	return monad<M>::return_(x);
}

template <>
struct monad<vector> {
	template <typename A, typename F>
	static auto bind(vector<A> const & x, F f) -> decltype(declval<F>()(declval<A>())) {
		typedef decltype(declval<F>()(declval<A>())) vector_B;
		vector_B ret;
		for (typename vector<A>::const_iterator it = x.begin(), iend = x.end(); it != iend; ++it) {
			vector_B r = f(*it);
			copy(r.begin(), r.end(), back_inserter(ret));
		}
		return ret;
	}
	template <typename T>
	static auto return_(T x) -> vector<T> {
		return vector<T>(1, x);
	}
};
class Monad m where
    return :: a -> m a
    (>>=) :: m a -> (a -> m b) -> m b

instance Monad [] where
    return x = [x]
    xs >>= f = concat (map f xs) 

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от wota

и таки первый уже в С++

Не прошло и 28 лет, ура! Глядишь, лет через 10 туда и GC запилят.

второй так и есть - монструозное нечто

То есть признал слив? Молодец. А loop я и сам не люблю — не lisp-way, благо в лиспе есть ещё дюжина удобных средств, а приспичит, я всегда свою макру могу накатать.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

Не прошло и 28 лет, ура!

весьма продуктивных 28 лет, надо отметить

То есть признал слив?

o_O, ну ладно, если тебе сильно хочется - мне не жалко

А loop я и сам не люблю — не lisp-way, благо в лиспе есть ещё дюжина удобных средств

и этом весь лисп

а приспичит, я всегда свою макру могу накатать.

и в этом тоже

wota ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.