LINUX.ORG.RU

C++20 и 2D Graphics

 ,


0

9

Исходник: https://isocpp.org/files/img/wg21-timeline-2017-11.png

Оказывается, все проблемы C++ уже решены, и теперь можно приступать к самой важной части системного языка - 2D графике.

Вопрос: что за безумие происходит в комитете C++? Зачем системному языку, да и вообще любому языку, 2D графика в std? Тем более, по слухам, они собираются использовать убогий cairo.

Из подобных языков приходит в голову только tcl/tk и red.

★★★★★

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

Еще можно вспомнить «исключения» в Rust, которые недавно значительно улучшили и теперь всего-то надо в каждой строке писать по ?, чтоб они работали.

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

Как минимум не нужно дважды описывать класс [...]

Это да, но авторы Rust и про тебя не забыли, и ты все-равно дважды «описываешь класс» через impl.

Только сейчас осознал, за что ненавижу всякие говноязычишки типа пыхтонга и прочей сценарной педерасни: за то, что объявление совмещено с реализацией. Открываешь такой "модуль" и на тебя сразу обрушивается стена говнокода, хотя хотел только интерфейс изучить.

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

Как будто в C++, да даже в C нет груды мусора в хедерах.

А так, может не стоит тащить привычки из 70-х в современные языки? Интерфейс по-другому изучается.

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

Открываешь такой «модуль» и на тебя сразу обрушивается стена говнокода, хотя хотел только интерфейс изучить.

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

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

Кроме того, можно будет точно так же выписать вначале интерфейс, а ниже разместить реализацию.

Естественно, так и должно быть, с препроцессором или без.

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

дважды «описываешь класс» через impl.

Вы с трейтами не путаете? Это их дважды, как в С++. impl MyStruct не содержит дублирующийся код.

вместо

Ну, во-первых, неявные приведения - зло. А во-вторых, вы что-то путаете. У вас какая-то каша в примере с rust. Что вы хотели им показать - не ясно.

Да и как должна выглядеть сигнатура метода в C++, чтобы она сама кастовала тип в optional? C++17 компилятора под рукой нет - проверить не могу.

Тем более вы только половину кода показали. Нам нужно не только создавать optional, но и использовать. А тут C++ сливает. Ибо аналога if let/match - нету.

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

В C++ неявных тройных приведений тоже нет вообще-то

Во-первых я там же написал про перегрузку функций. Во-вторых в С++ есть шаблонные конструкторы, которые позволяют добавить еще один уровень, вот практически этот же пример:

#include <iostream>
#include <optional>
using namespace std;

void foo(optional<string> s) {
    if(s)
        cout << *s << endl;
}

int main() {
    foo("123");
}

Строковой литерал - это массив символов, кастим в указатель, строим строку, из нее строим optional.

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

impl MyStruct не содержит дублирующийся код.

Реализация в С++ тоже не содержит дублирующийся код.

Ну, во-первых, неявные приведения - зло.

Если говорить о компактности кода - это добро.

А во-вторых, вы что-то путаете. У вас какая-то каша в примере с rust. Что вы хотели им показать - не ясно.

Да ладно, ты еще скажи, что Some, ::new и пр. не обязательный атрибут типичного кода на Rust.

Да и как должна выглядеть сигнатура метода в C++, чтобы она сама кастовала тип в optional?

Выше написано, все просто.

А тут C++ сливает. Ибо аналога if let/match - нету.

Ну конечно, ведь:

if(s)

действительно сливает в краткости:

if let Some(s) = o

Это же очевидно.

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

Реализация в С++ тоже не содержит дублирующийся код.

А описывать методы в хедере и сорце кто будет?

Если говорить о компактности кода - это добро.

Ок, спишем на вкусовщину.

Да ладно, ты еще скажи, что Some, ::new и пр. не обязательный атрибут типичного кода на Rust.

Обязательный, и это хорошо.

Выше написано, все просто.

Уже увидел. Я такой код в жизни не напишу, ибо ничего не ясно.

действительно сливает в краткости

В случае с optional - да, в случае с variant - нет.

Но если говорить чисто об краткости - то да. Но в данном примере C++ небезопасен, в отличии от раста.

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

ты все-равно дважды «описываешь класс» через impl

Можно описывать за один раз:

trait Foo {
    fn bar(int: i32) -> i32 {
        int
    }
}

foo(Some(ILoveRust::new(n as i32)));

вместо:

foo(n)

... и это нужно для чего?

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

Ты лучше расскажи зачем в твоем любимом Rust нужны костыли вроде:

Не похоже, что оно сильно востребовано.

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

А описывать методы в хедере и сорце кто будет?

Точно так же как отдельный impl (название как бы намекает) не бывает без struct, так и отдельная реализация метода не бывает без прототипа. Или ты хотел бы не иметь протип в теле класса? Это принесло бы больше минусов чем плюсов.

Но в данном примере C++ небезопасен, в отличии от раста.

А это совсем отдельный разговор и тут я не буду спорить, С++ действительно тут хуже.

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

Ты лучше расскажи зачем в твоем любимом Rust нужны костыли вроде:

https://crates.io/crates/downcast-rs

Там же написано: «But in the case where you want to implement a container of user-defined types, an open-ended type like a trait object is needed».

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

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

Еще можно вспомнить «исключения» в Rust, которые недавно значительно улучшили и теперь всего-то надо в каждой строке писать по ?, чтоб они работали.

Вы бредите. ? это синтаксический сахар для обработки ошибок, которая в своей основе не улучшалась и не ухудшалась. А исключений в Rust нет.

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

Не понимаю, почему все пытаются разубедить RazrFalcon'a? Пусть агитирует за Rust дальше, не дай бог переубедите, и он начнет также за C++ агитировать :). Такие адепты - это же позор для языка :)

not_rj45
()
Ответ на: комментарий от Virtuos86

Можно описывать за один раз:

У вас данные отклеились.

... и это нужно для чего?

Для вызова фунции. За примерами можно сходить в код servo, например.

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

Вы бредите. ? это синтаксический сахар для обработки ошибок, которая в своей основе не улучшалась и не ухудшалась. А исключений в Rust нет.

Ты перед тем как умничать во-первых обрати внимание на кавычки, а во-вторых прочитай сам:

https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception...

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

вово. мы тоже переписали пару сервисов на расте и закинули его нах далеко и на годик-другой. Какой-то он уродец стал. Да и не дает никакого выигрыша ни в работе, ни в продакшене.

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

Вы бредите. Показываю на пальцах:

// h
class MyClass
{
public:
    void myMethod();
}

// cpp
MyClass::myMethod() {} // описываем сигнатуру повторно
vs
struct MyStruct;

impl MyStruct {
    pub fn my_method() {} // сигнатура в одном экземляре
}

И вообще, любой спор о краткости Rust vs C++ заканчивается на том, что у C++ есть хедеры, которые автоматом раздувают код.

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

Не понимаю, почему все пытаются разубедить RazrFalcon'a?

Лично я хочу, чтоб разубедили меня, а не я кого-то. Чтоб мне таки продали Rust и показали что-то действительно интересное в нем, что я как мимо-крокодил и унылый тролль не вижу и не знаю.

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

Если вы внимательно почитаете - то это просто сахар для '?'. Про реальные «исключения», ака panic, там ни слова.

И это rfc. В языке/компиляторе этого ещё нет и не известно когда будет.

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

Что рождает массу кода вида:
foo(Some(ILoveRust::new(n as i32)));

Не рождает, потому что есть From.

quantum-troll ★★★★★
()
Ответ на: комментарий от RazrFalcon

Вы бредите. Показываю на пальцах (c)

struct MyStruct {
    pub n: i32
}

impl MyStruct { // Что это? Опять MyStruct??? Мы же его уже описали, WTF
    pub fn my_method() {}
}

vs

struct MyClass { // Класс в одном экземпляре и в одном месте
    int n;
    void my_method() {}
}

И вообще, любой спор о краткости Rust vs C++ заканчивается на том, что у C++ есть хедеры, которые автоматом раздувают код.

Ты слишком преувеличиваешь. Если выкинуть комментарии из хедеров и посмотреть именно на «лишние» прототипы, то там будет минимальная разница. одни только impl и трейты дадут не меньше дополнительных строк, т.к в С++ реализация в одном месте, а не раскидана на отдельные части.

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

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

Чтобы вам стало понятно происходящее: Rust откровенно плох как язык для системного программирования. Но адепты почему-то верят в обратное. Раньше такие же хабалки кричали что java в сотни, а иногда в тысячи раз быстрее ассемблера, потому что ее писали гении. Во всех остальных фичах языка можете пытаться переубедиться. Как прикладой язык или еще одна веб-технология раст возможно имел бы все шансы, но...)

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

Класс в одном экземпляре и в одном месте

Я не про имя класса, а про методы. Их нужно дважды писать. Или вы все методы прямо в хедере реализуете? Ну тут ничего не поделаешь...

т.к в С++ реализация в одном месте, а не раскидана на отдельные части.

Шиза... Зачем тогда в C++ два файла: cpp и h? Или вы не в курсе о существовании cpp файлов?

Ты слишком преувеличиваешь.

Я пишу код на C++ и Rust. На Rust как минимум на 50% меньше кода.

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

Или вы не в курсе о существовании cpp файлов?

знаю реализацию целого учебного языка на одних только хедерах (ну + 1 цпп для вызова всего этого безобразия). даже с хвостовой рекурсией и подобием gc =)

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

Я пишу код на C++ и Rust. На Rust как минимум на 50% меньше кода.

Ну да, если вручную имитировать Variant и не пользоваться шаблонами и готовыми библиотеками, то удивительно, что разрыв всего в 50%.

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

Шиза... Зачем тогда в C++ два файла: cpp и h? Или вы не в курсе о существовании cpp файлов?

Ты это, остынь, тогда проще думать будет. Я про то, что в С++ class - все в одном, а в Rust у тебя масса отдельных impl, и, внезапно, это те самые дополнительные строки, на которые ты жалуешься, К примеру, на С++:

struct A {
    virtual int foo() = 0;
};

struct B : A {
    int n_;
    B(int n) : n_(n * 10) {}
    int foo() override { return n_; }
}

В классе 'B' - все в одном месте, а на Rust?

Я пишу код на C++ и Rust. На Rust как минимум на 50% меньше кода.

Выше уже выяснилось, что ты плохо знаешь С++. И это нормально. Я плохо знаю Rust, ты плрхо знаешь С++, потому и выбираем разные инструменты.

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

Лично я хочу, чтоб разубедили меня, а не я кого-то. Чтоб мне таки продали Rust и показали что-то действительно интересное в нем

Но кому и зачем это может понадобиться? Ты ветеран растосрачей, если еще не нашел в нем ничего интересного - вполне очевидно, что твои интересы лежат где-то в стороне.

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

Я говорил чисто про пример, который я привёл. Вы же по прежнему пытаетесь тулить реализацию в хедер. Теперь ещё и виртуальные методы приплели.

Если вам не нравится, что у в Rust реализация отдельно от данных - это одно, но к объему кода это не имеет ни какого отношения.

Выше уже выяснилось, что ты плохо знаешь С++.

Достаточно. Или вы занимаетесь исключительно вангованием? Я бы не прочь посмотреть на ваш гитхаб, если он у вас есть.

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

То, что там печально - я в курсе. Наследование мне, для таких проектов, - совсем не нужно.

Я в свободное время свои биндинги пилю, без автогенерации. Чисто к виджетам. Хз что получится.

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

Вы же по прежнему пытаетесь тулить реализацию в хедер

В данном случае там просто нечего выносить в .cpp. Не надо доводить все до абсурда.

Если вам не нравится, что у в Rust реализация отдельно от данных - это одно, но к объему кода это не имеет ни какого отношения.

В Rust нет одной реализации, есть размазанная логика по трейтам и их реализациям. И это кроме объема кода влияет еще и на читабельность. В то время как хедеры при грамотном использовании ее повышают.

Достаточно. Или вы занимаетесь исключительно вангованием?

Ну, например, про это говорит твой вопрос относительно optional.

Я бы не прочь посмотреть на ваш гитхаб, если он у вас есть.

Есть, но тут такая публика, что светить его нет желания.

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

В данном случае там просто нечего выносить в .cpp. Не надо доводить все до абсурда.

Лол. У вас все методы однострочные?

В Rust нет одной реализации, есть размазанная логика по трейтам и их реализациям.

То есть шаблонов и наследования в C++ нет?

Ну, например, про это говорит твой вопрос относительно optional.

Это говорит о том, что я не работал с C++17.

Есть, но тут такая публика, что светить его нет желания.

Лол x2.

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

Лол. У вас все методы однострочные?

Нет, но конкретно в том примере - да.

То есть шаблонов и наследования в C++ нет?

Мой пример как раз про наследование, B наследается от А - в B и находится реализация.

Это говорит о том, что я не работал с C++17.

Конструктор optional не использует новых возможностей из С++17.

anonymous
()

К слову, выше там писали, что downcast в Rust не востребован, смотрю код servo и, внезапно:

actor.actor_as_any_mut().downcast_mut::<T>().unwrap()
extension.as_any().downcast_ref::<TypedWebGLExtensionWrapper<T>>().and_then(|extension| {
if let Some(event) = event.downcast::<ErrorEvent>() {
...

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

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

Разработчики не знают как правильно. И вообще хипсторы. Слушай аналитиков. К тому ж серво это «не настоящий проект» и «не должен работать правильно».

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

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

quantum-troll ★★★★★
()
Ответ на: комментарий от anonymous
actor.actor_as_any_mut().downcast_mut::<T>().unwrap()
extension.as_any().downcast_ref::<TypedWebGLExtensionWrapper<T>>().and_then(|extension| {
if let Some(event) = event.downcast::<ErrorEvent>() {
...

Йопь. И эти люди что-то про йебанутость синтаксиса плюсов заявляют?

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

У вас данные отклеились.

Какие данные у типажа? Ассоциированные типы?

... и это нужно для чего?

Для вызова фунции. За примерами можно сходить в код servo, например.

Я спрашивал, зачем нужен неявный каст в подобном виде.

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

есть (практически) всё необходимое, чтобы их изобразить

Вот как изобразите, тогда и приходите спорить. А пока их нет. Есть обработка ошибок и определенная методология, которая позволяет сделать её удобоваримой и не особо перегруженной лишними подробностями.)

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