Anatoly
Человек пришел из шарпа, спрашивает как дела обстоят в С++
Anatoly
Что не так?
🦥Alex Fails
#holywar
🐙 Antony
А где здесь множественное наследование? fin->right<left>->left->base. Простое же наследование.
Вот тут множественное: class fin final: left, right; Верхний пример - это как без него обойтись
доня.
это общепринятые практики, если ты о них не в курсе - твои проблемы и да, "сишники" - это ты про кого?
доня.
с чего такие выводы?
доня.
а, то есть ты ещё и C и C++ не различаешь так и запишем
доня.
всё понятно с тобой, можешь прекратить позориться уже
🦥Alex Fails
Давайте вы свою бурную дискуссию в лс переместите.
🦥Alex Fails
Ща дропнем в холивары😊
Deleted Account
множественое наследование класная штука, её нет тока в убогих языках
доня.
Есть места где множественное наследование ну прям напрашивается. Например делаете вы обработчик сообщений. В зависимости от чего-то там, у вас на вход могут сообщения приходить по разным протоколам, уходить по другим протоколам. Ну и напрашивается - сдалть базовый класс, сделать N классов принимающих сообщения, M классов отправляющих сообщения. Множественным наследованием всё это связать и получить NxM классов. Но проблема в том, что вам необходимо наследоваться от базового класса виртуально. Это может быть ощутимым ударом по производительности, если в большинстве вызовов используется именно базовый класс. Так что смотрите и выбирайте сами - между удобством и производительностью. Ну и общая рекомендация - если можно обойтись композицией вместо наледования - выбирайте композицию.
хм, ну архитектурно лучше всего было бы имхо сделать всё на динамической диспетчеризации т.е. чтоб можно было регестрировать свои обработчики для типа сообщений динамически мб что-то типа middleware вообще другой вопрос, что это конечно повлекло бы оверхед в рантайме, так что тут по ситуации
доня.
хм, ну архитектурно лучше всего было бы имхо сделать всё на динамической диспетчеризации т.е. чтоб можно было регестрировать свои обработчики для типа сообщений динамически мб что-то типа middleware вообще другой вопрос, что это конечно повлекло бы оверхед в рантайме, так что тут по ситуации
потому что тут опять-таки проблема расширяемости варианта с наследованием вот в какой-то прекрасный момент понадобится иметь разный набор протоколов в двух местах приложения в варианте с диспетчеризацией просто создаёшь новый инстанс и у него регестрируешь новые типы сообщений
доня.
при чём тут язык вообще, лол я о подходе
🦥Alex Fails
Тут знак не "равно", а "подразумевает"
доня.
в данном случае язык тут не при чём в питоне тоже есть наследование (и даже множественное), и его там довольно активно используют
Constantine
Вот у меня есть класс фабрики MC объектов по прототипу и по-хорошему он не MC, поскольку создаваемый объект содержит ссылку на фабрику, но мне нужно, чтобы объект инициализировался через {} в структурах как обычно (по прототипу)
Constantine
Вопрос: есть ли смысл писать proposal, чтобы можно было объявить Move Constructor так, чтобы был разрешен Move Elision, но не был разрешен Move Constructor
Constantine
что-то вроде classname(classname && other) = elisioned;
🐙 Antony
Constantine
хм... это категорически не очевидно
Berkus
что-то вроде classname(classname && other) = elisioned;
elided слово в совершенной форме
Constantine
Так ведь из коробки в С++17. Если пишешь classname(classname && other) = delete; то copy elision разрешен
Мы точно правильно понимаем друг друга? Класс не Сopy Constructible, если я удаляю Move Constructor то я могу использовать {} structure initializator?
Constantine
И случаи, когда происходит copy/move elision?
🐙 Antony
И случаи, когда происходит copy/move elision?
Мы про этот случай ? classname(classname && other) = delete; ... template <class... Args> classname make_classname(Args... args) { classname c (args...); c.init(); return c; // copy elision, compiles in C++17 }
Constantine
class factory { public: factory(){}; factory(factory const& other) = delete; factory(factory && other) = delete; }; void f() { factory f = factory(); //11 : <source>:11:25: error: use of deleted function 'factory::factory(factory&&)' }
Constantine
хм... clang скомпилировал под -std=c++1z
🐙 Antony
gcc 7.1 тоже https://godbolt.org/g/X6gQRf
🐙 Antony
С С++17 это идёт из коробки.
Constantine
Угу. Спасибо, а какая точная формулировка теперь на Copy/Move elision?
Constantine
В смысле, как ее блокировать-то? :)
🐙 Antony
Вроде никак :) Это равносильно тому, что компилятор сразу создаст по мету нужный объект, без всяких копирований и перемещений
Constantine
class factory { public: factory(){}; factory(factory const& other) = delete; factory(factory && other) = delete; }; factory g() { return factory(); } void f() { factory f = g(); //немного взрывает мозг, но все ок }
🐙 Antony
class factory { public: factory(){}; factory(factory const& other) = delete; factory(factory && other) = delete; }; factory g() { return factory(); } void f() { factory f = g(); //немного взрывает мозг, но все ок }
Ага, для этого и делалось - чтобы можно было делать фабрики для классов которые нельзя копировать и перемещать
Constantine
Всегда приятно, когда комитет догадался о чем-то до меня :) Осталось подождать MS, хехехе
Anatoly
Ага, для этого и делалось - чтобы можно было делать фабрики для классов которые нельзя копировать и перемещать
но если я помещю factory(factory const& other) = delete; factory(factory && other) = delete; в приватный раздел, по идее, приведенный выше код не должен скомпилироваться
Anatoly
Или как, @antoshkka ?
Aleksei
а оператор = не надо?
Anatoly
в этом примере он не задействован
Anatoly
Хьюстон, есть кто на базе?
🐙 Antony
Или как, @antoshkka ?
Я попробовал - компилирует и с private :) Там до конструкторов вообще дело не доходит
Anatoly
да, получается, что это вообще не оптимизация, а полностью переработанная концепция: In a function call, if the operand of a return statement is a prvalue and the return type of the function is the same as the type of that prvalue. T f() { return T{}; } T x = f(); // only one call to default constructor of T, to initialize x T* p = new T(f()); // only one call to default constructor of T, to initialize *p Note: the rule above does not specify an optimization: C++17 core language specification of prvalues and temporaries is fundamentally different from that of the earlier C++ revisions: there is no longer a temporary to copy/move from.
Vladislav
нормально там
objC и С++ нормальные по-отдельности, но их комбинация objC++ - адов франкенштейн. Там все фичи дублированны по 2 раза - две (несовместимых) системы классов, два (несовместимых) синтаксиса лямбд, две (несовместимых) системы эксепшнов, и т.д.
Nik
а зачем он тогда вообще?
 Sergey
в мобильной разработке под ios
Vladislav
в основном, чтобы писать обертки над плюсовым кодом для дерганья из objC
Nik
А как же модненький свифт?
Сергѣй
Только хотел это написать.
 Sergey
переписывать работающие аппы никто не станет
Vladislav
А как же модненький свифт?
оно (objC++) появилось задолго до свифта
Vladislav
fortran - тоже легаси, но даже на нем еще пишут
Сергѣй
Я несколько матерных писем в апл написал из-за этого языка, ад конечно, а они сейчас на нем весь метал написали , а шейдеры на С++
Сергѣй
Но мне было важно это сказать =))
HASTUR
Тут 1.5к программистов по сишарп?! Ууу... Неплохо) Тоже решил научиться сишарпу После теста в гикбрейнс 🌝
HASTUR
Что тут плохого?
Vladislav
Аххаха
🦥Alex Fails
Это чат по языкам C/C++. Про c# велком в другой чат: @pro_net
Крылатый
Это чат по языкам C/C++. Про c# велком в другой чат: @pro_net
По шарпу есть специальный чатег https://t.me/CSharpChat
Крылатый
Бля
HASTUR
Балин Точно
Крылатый
Вот.
Aleksei
1c-ник в чате!!!
HASTUR
Перепутал Бывает
HASTUR
Parviz
хэлоу
Крылатый
Она на git переходить не собираются?
Danil
а что делать надо и какими объемами?
Крылатый
Видел.
Крылатый
Почему?
 Sergey
в мейнтейнеры берут всех желающих или есть какой-то отбор?
Danil
полотенце в ноги бросают?
Ivan
Не каждый пройдёт прописку
Stanislav
https://blogs.msdn.microsoft.com/visualstudio/2017/08/14/visual-studio-2017-version-15-3-released/
Stanislav
whoohoo
Tom
А ты про какую либу вообще?