а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 12:10
Оценка: -1
насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Великий Мессия google
Дата: 30.06.25 12:22
Оценка:
Здравствуйте, wl., Вы писали:

wl.>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


за пределами куте, они нигде не используются
щарп не просто язык
там и гуи насколько я понимаю


вообще не плохо интересоваться работой комитета
что бы понимать что основная нагрузка идет
на разбор и отфутболивание тупых пропозлов
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: SаNNy Россия  
Дата: 30.06.25 12:28
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>за пределами куте, они нигде не используются


логично, это ж кутешная примочка
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 12:42
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>Здравствуйте, wl., Вы писали:


wl.>>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


ВМ>за пределами куте, они нигде не используются

ВМ>щарп не просто язык
ВМ>там и гуи насколько я понимаю

так сигналы это не только GUI — асинхронная работа сети та же, но тут, конечно, ASIO тоже не часть стандарта С++
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: velkin Земля  
Дата: 30.06.25 12:42
Оценка: 1 (1) +2
Здравствуйте, wl., Вы писали:

wl.>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


Потому что в Qt мета-объектный компилятор, сокращённо moc. Он сначала парсит C++ код со специальными для него вставками включая макросы, а потом генерирует дополнительные moc_*.cpp файлы используя конструкции C++. И только потом это попадает в компилятор C++. Мета-объекты, а так же сигналы и слоты работающие за счёт них не являются частью стандарта C++.

Более того мета-объектный компилятор генерирует конструкции вида switch и if. То есть ты бы сам мог руками прописать, что он там генерирует, но без ограничений moc, а исходя из своей фантазии ограничивающейся лишь C++. Или и вовсе взять решения из Boost. Почему, к примеру, Qt, а не Boost по твоему лучше?

Лично я думаю, что если в C++ официально будут вводить сигнал и слоты, то к Qt это не будет иметь отношения.
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Великий Мессия google
Дата: 30.06.25 12:48
Оценка:
Здравствуйте, wl., Вы писали:

wl.>Здравствуйте, Великий Мессия, Вы писали:


ВМ>>Здравствуйте, wl., Вы писали:


wl.>>>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


ВМ>>за пределами куте, они нигде не используются

ВМ>>щарп не просто язык
ВМ>>там и гуи насколько я понимаю

wl.>так сигналы это не только GUI — асинхронная работа сети та же, но тут, конечно, ASIO тоже не часть стандарта С++


std::function прекрасно с этим справляется
экзекуторы которые завезли в С++26 тоже прекрасно работают без сигналов
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 12:54
Оценка: +1 :)
Здравствуйте, velkin, Вы писали:

V>Почему, к примеру, Qt, а не Boost по твоему лучше?


По-моему, Qt стремится к простоте, а Boost к библиотечной сложности
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Философ Ад http://vk.com/id10256428
Дата: 30.06.25 12:56
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>щарп не просто язык

ВМ>там и гуи насколько я понимаю

До гуи в языке только Борланд мог додуматься, в шарпе такого не было, нет, и врядли будет.
Если что, я про вот такое:
    procedure WMStuff(var Message: TMessage); message WM_Stuff;
Всё сказанное выше — личное мнение, если не указано обратное.
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 12:57
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

ВМ>std::function прекрасно с этим справляется

ВМ>экзекуторы которые завезли в С++26 тоже прекрасно работают без сигналов

ну наверное, мне просто не понятно, почему такая удачная реализация асинхронности не входит в язык без костылей препроцессора Qt
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Нomunculus Россия  
Дата: 30.06.25 13:05
Оценка: :)))
Здравствуйте, wl., Вы писали:

wl.>По-моему, Qt стремится к простоте, а Boost к библиотечной сложности


Для меня Boost превратил С++

  из этого


  в это
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 13:08
Оценка:
Здравствуйте, wl., Вы писали:

wl.>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


Нахрен они нужны в стандарте.

А вот property с get/set хэндлерами были очень приятны
Маньяк Робокряк колесит по городу
Re[5]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 13:09
Оценка: +1
Здравствуйте, wl., Вы писали:

wl.>ну наверное, мне просто не понятно, почему такая удачная реализация асинхронности не входит в язык без костылей препроцессора Qt


Ничего там удачного нет, одни костыли
Маньяк Робокряк колесит по городу
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 13:10
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>До гуи в языке только Борланд мог додуматься, в шарпе такого не было, нет, и врядли будет.

Ф>Если что, я про вот такое:
Ф>
Ф>    procedure WMStuff(var Message: TMessage); message WM_Stuff;
Ф>


А что это? И причем тут язык? Кстати, язык явно не плюсы, дельфячка, судя по всему
Маньяк Робокряк колесит по городу
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 13:12
Оценка:
Здравствуйте, Marty, Вы писали:

M>А вот property с get/set хэндлерами были очень приятны


Эх... и это в Qt тоже есть, пусть и не так удобно, как в C#
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Великий Мессия google
Дата: 30.06.25 13:13
Оценка: 3 (1)
https://lists.isocpp.org/std-proposals/2021/07/2835.php

зачитавайтесь
далее там некст бай месседж
с 21 года вяло обсуждают по сей день
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 13:19
Оценка:
Здравствуйте, wl., Вы писали:

M>>А вот property с get/set хэндлерами были очень приятны


wl.>Эх... и это в Qt тоже есть, пусть и не так удобно, как в C#


Это ещё борман делал в середине 90ых в своих дельфях нативно, и перенёс в свой плюсовый билдер с нативной поддержкой компилятором:

class TMyComponent : public TComponent
{
private:
    int FMyValue;
    void __fastcall SetMyValue(int Value);
public:
    __property int MyValue = { read=FMyValue, write=SetMyValue };
};


Мне нравилось, я подобное делал на плюсах без всякого кути, но без макросов не обходилось
Маньяк Робокряк колесит по городу
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Философ Ад http://vk.com/id10256428
Дата: 30.06.25 13:24
Оценка: 1 (1)
Здравствуйте, Marty, Вы писали:

Ф>>
Ф>>    procedure WMStuff(var Message: TMessage); message WM_Stuff;
Ф>>


M>А что это? И причем тут язык? Кстати, язык явно не плюсы, дельфячка, судя по всему


Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[5]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 13:28
Оценка:
Здравствуйте, Философ, Вы писали:

M>>А что это? И причем тут язык? Кстати, язык явно не плюсы, дельфячка, судя по всему


Ф>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.


Нет, диспатчер не встроен в язык, это исключительно библиотечная пристройка. Всё тоже самое было и билдере, фришным компилятором которого (BC++5.5) я некоторое время пользовался для написания и гуишных и консольных программ
Маньяк Робокряк колесит по городу
Re[6]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 13:48
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Философ, Вы писали:


M>>>А что это? И причем тут язык? Кстати, язык явно не плюсы, дельфячка, судя по всему


Ф>>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.


M>Нет, диспатчер не встроен в язык, это исключительно библиотечная пристройка. Всё тоже самое было и билдере, фришным компилятором которого (BC++5.5) я некоторое время пользовался для написания и гуишных и консольных программ


а почему не самим билдером? в те годы всё подобное ПО было толи взломанным, толи вообще без защиты
Re[7]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 13:55
Оценка:
Здравствуйте, wl., Вы писали:

M>>Нет, диспатчер не встроен в язык, это исключительно библиотечная пристройка. Всё тоже самое было и билдере, фришным компилятором которого (BC++5.5) я некоторое время пользовался для написания и гуишных и консольных программ


wl.>а почему не самим билдером? в те годы всё подобное ПО было толи взломанным, толи вообще без защиты


Потому, что билдер был не нужен, не хотел завязываться на их библиотеки
Маньяк Робокряк колесит по городу
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: velkin Земля  
Дата: 30.06.25 15:09
Оценка:
wl.>По-моему, Qt стремится к простоте, а Boost к библиотечной сложности

Qt стремится к божественным объектам, а тащит он за счёт готового функционала. По моей классификации программисты на Qt это четвёртое поколение программистов, которое я назвал пользователями.

Почему программисты прошлого были умнее (26.05.2022)

4. Поколение программистов пользователей (2000-2020+)


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

Проблема в том, что в каждом поколении есть свои тренды. Если человек начал как пользователь какой-то библиотеки, то ему сложно будет пройти по предыдущим путям. Да и захочет ли он так делать, ведь вызывать готовую функцию всяко проще, чем писать её самому. А даже если и захочет, то появилось куча мусорной литературы. Я бы даже сказал так, поколение программистов пользователей может даже не понимать, что у них в образовании имеются некие проблемы, да и не для всех это действительно проблемы.


Начать с того, что есть разные подходы в программировании.
Для примера книга Функциональное программирование на языке C++. Чукич Иван.

Там на мой взгляд хорошо объясняется программирование без состояния и программирование с состоянием.
1. Просто Qt это по большей части объектно-ориентированное программирование за исключением контейнеров в стиле C++ где используется обобщённое программирование.
2. Boost же преимущественно использует обобщённое программирование, в частности обобщённое функциональное и обобщённое объектно-ориентированное.

Если не слишком вдаваться в детали, то это фактически объектно-ориентированное программирование в Qt против обобщённого в Boost. К примеру я особо не практиковал обобщённое программирование, хотя у него есть множество преимуществ в создании битомолок, а в основном использую объектно-ориентированное или даже процедурное. То есть я даже функциональное программирование не использую.

Так вот дело не в том, что там что-то сложнее, а в том, что раз я активно не практиковал обобщённое программирование, то лично для меня оно становится сложнее. Хотя это вовсе не значит, что оно сложнее. Я на ту же высшую математику забил уже 25 лет назад, потому меня и математик легко в математике обскачет.

А про то, что на Qt код нужно не писать, а попросту использовать и так понятно, но и производительности как в обобщённом программировании не жди. Я когда писал про if и switch намекал, что Qt как бы не пытается в производительность. И сигналы и слоты это довольно тормознутая штука сочетающая генерацию кода и очереди. Вот потому она и не попадёт в стандарт именно из Qt.

Вся же якобы лёгкость это объектно-ориентированная парадигма и уже кем-то написанный код. Самому писать код в объектно-ориентированной парадигме проще только если заморочиться именно им, но код не гибкий. Я об этом писал в статье.
Катастрофа ООП и многомерные модели данных (21.10.2021)

Про Qt ещё могу сказать, что в нём реализовано очень много готовых шаблонов проектирования и этим он схож с .NET. То есть часть правды есть, что Qt якобы стремится к простоте, а Boost к сложности, но это только на уровне программистов пользователей фреймворков не осиливших обобщённое программирование, не интересующихся математикой, аппаратурой с машинными кодами и абстракциями за пределами объектно-ориентированной парадигмы.

Лично для себя я это записал в пробелы в моём образовании. И даже не совсем так, учить то я учил, только всё забыл. А дальше я традиционно затяну волынку про карточки, графы и прочее, и почему большинство сколько бы не платили за обучающие курсы остаются с носом и как это исправить.

И ещё я хотел написать про то, что сигналы и слоты могут быть.
1. Стандартом самого языка C++.
2. Входить в стандартную библиотеку шаблонов STL за счёт уже существующих инструкций языка C++.
3. Входить в любую другую библиотеку, хоть Boost, хоть Qt, хоть самопис.

И здесь.
1. Если сигналы и слоты не входят прямо в стандарт C++, то честно сказать это мало интересно. Даже если их запихнут в STL не факт, что их будут использовать, как часто не используют и сам STL.
2. А если сигналы и слоты запихнут в стандарт C++, то понятно, что та же Qt вряд ли от этого будет полностью изменена под новый стандарт.

И даже C# это в основном приблуда для .NET, так же как Visual Basic.NET и прочие. Может быть и хорошо было бы добавить всю мета-объектную систему как в Qt или .NET в стандарт C++, то есть в сам язык, как об этом писал в книге Чистая архитектура. Мартин Роберт, говоря о поддержке парадигмы языком. Да, по сути мы сейчас говорим о добавлении ещё одной парадигмы в C++.

Парадигма программирования
Парадигмы программирования
    • Императивная
(контрастирует с декларативной) 
        ◦ Процедурная 
        ◦ Структурная 
        ◦ Аспектно-ориентированная 
        ◦ Объектно-ориентированная 
            ▪ Агентно-ориентированная 
            ▪ Компонентно-ориентированная 
            ▪ Прототипно-ориентированная
        ◦ Обобщённое программирование
    • Декларативная
(контрастирует с императивной) 
        ◦ Чистота языка 
            ▪ Чистота функции
        ◦ Функциональная 
            ▪ В терминах рефал-машины 
            ▪ Аппликативная 
            ▪ Комбинаторная 
            ▪ Бесточечная 
                • (чистая конкатенативная)
        ◦ Логическая 
            ▪ Ограничениями
    • Конкатенативная 
    • Векторная 
    • Метапрограммирование 
        ◦ Языково-ориентированная 
            ▪ Предметно-ориентированная 
            ▪ Пользователями
        ◦ Автоматизация процесса программирования
    • Рефлексивность 
        ◦ Гомоикони́чность
    • Связанные темы 
        ◦ Программирование в крупном и мелком масштабе[англ.] 
        ◦ Модульность 
        ◦ Полиморфизм 
        ◦ Продолжения и CPS 
        ◦ Параллелизм
    • Методы и алгоритмы 
        ◦ Автоматное 
        ◦ Потоков данных 
        ◦ Событийно-ориентированное 
        ◦ Реактивное 
        ◦ Сервис-ориентированное

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

Лично я же считаю, что разивать нужно структуру мозгов самих людей. Те же разработчики Qt взяли и создали собственный мета-объектный компилятор. Причём мета как бы намекает на парадигму. Но вообще говоря в Qt я дольше выставляю все эти мета-конструкции, чем пишу код.
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: LaptevVV Россия  
Дата: 30.06.25 15:12
Оценка:
wl.>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся
Да это частное решение частной конторы.
Пока не до таких мелочей — рефлексию внедряют.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 15:30
Оценка:
Здравствуйте, LaptevVV, Вы писали:

wl.>>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся

LVV>Да это частное решение частной конторы.
LVV>Пока не до таких мелочей — рефлексию внедряют.

в том посте, что Мессия привел, тоже про рефлексию пишут, типа без неё никак. ну чтож
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Великий Мессия google
Дата: 30.06.25 15:36
Оценка:
Здравствуйте, wl., Вы писали:

wl.>Здравствуйте, LaptevVV, Вы писали:


wl.>>>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся

LVV>>Да это частное решение частной конторы.
LVV>>Пока не до таких мелочей — рефлексию внедряют.

wl.>в том посте, что Мессия привел, тоже про рефлексию пишут, типа без неё никак. ну чтож


рефлексия поможет только отказаться от внешний утилит которые moc обрабатывают
но тянуть в язык эти сигналы, так себе удовольствие
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 15:38
Оценка:
Здравствуйте, Великий Мессия, Вы писали:

wl.>>в том посте, что Мессия привел, тоже про рефлексию пишут, типа без неё никак. ну чтож

ВМ>рефлексия поможет только отказаться от внешний утилит которые moc обрабатывают
ВМ>но тянуть в язык эти сигналы, так себе удовольствие

ну yield же притащили, и потоки! остался последний шажок
Re[5]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Великий Мессия google
Дата: 30.06.25 15:54
Оценка:
Здравствуйте, wl., Вы писали:

wl.>Здравствуйте, Великий Мессия, Вы писали:


wl.>>>в том посте, что Мессия привел, тоже про рефлексию пишут, типа без неё никак. ну чтож

ВМ>>рефлексия поможет только отказаться от внешний утилит которые moc обрабатывают
ВМ>>но тянуть в язык эти сигналы, так себе удовольствие

wl.>ну yield же притащили, и потоки! остался последний шажок


yield != co_yield

но повторюсь
сигналы за пределами куте не нужны
а завезенные экзекуторы в С++26
умеют строить connect() итд цепочки

сигналы и слоты придумали исключительно для куте
и если их и тянуть то со всей куте, а это вряд ли

все остальное в С++ решается без сигналов и слотов
даже asio без них чудесно поживает
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: dsorokin Россия  
Дата: 30.06.25 16:19
Оценка:
Здравствуйте, wl., Вы писали:

wl.>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


Потому что для этого нужна кутешная модель работы с памятью (родитель — дочерние). Там совсем все по-другому, не как в обычных плюсах. Такая своя отдельная волость со своим стилем написания программного кода
Re[6]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Философ Ад http://vk.com/id10256428
Дата: 30.06.25 16:36
Оценка:
Здравствуйте, Marty, Вы писали:

Ф>>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.


M>Нет, диспатчер не встроен в язык, это исключительно библиотечная пристройка. А вот это как называется? Вот ты знаешь способ, которым можно отлючить эту "библиотечную" приблуду? Я про то, что это system.pas и это вообще метод корневого класса — предка вообще всех классов в делфе. Exit, тащемта тамже находится.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 30.06.25 16:37
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Здравствуйте, wl., Вы писали:


wl.>>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


D>Потому что для этого нужна кутешная модель работы с памятью (родитель — дочерние). Там совсем все по-другому, не как в обычных плюсах. Такая своя отдельная волость со своим стилем написания программного кода


да, точно, в C# тоже есть базовый класс со всей функциональностью
Re[7]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.06.25 16:46
Оценка: +1
Здравствуйте, Философ, Вы писали:

Ф>>>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.


M>>Нет, диспатчер не встроен в язык, это исключительно библиотечная пристройка.



Поправил ответ, ты же это писал:

Ф>А вот это как называется? Вот ты знаешь способ, которым можно отлючить эту "библиотечную" приблуду? Я про то, что это system.pas и это вообще метод корневого класса — предка вообще всех классов в делфе. Exit, тащемта тамже находится.


Это — библиотека. То, что в библиотеке есть God-object, ничего не меняет. Это как сказать, что Qt — это часть языка C++, потому там тоже есть свой God-object — QObject.

Я хз, как на дельфи, но на билдере можно было вполне писать консольные проги (да и виндовые, так-то, тоже, но без VCL этим, думаю, мало кто занимался). Думаю, на Дельфи тоже можно было писать консольные проги без VCL, c виндовыми, конечно, там наверняка гораздо сложнее, чем в плюсах
Маньяк Робокряк колесит по городу
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: ononim  
Дата: 30.06.25 17:06
Оценка: +3 :)
ВМ>что бы понимать что основная нагрузка идет
ВМ>на разбор и отфутболивание тупых пропозлов
Да, а пропускают самые мозгодробильные. В этом и беда С++.
Как много веселых ребят, и все делают велосипед...
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: SaZ  
Дата: 30.06.25 18:13
Оценка: 3 (1) +3 -1
Здравствуйте, wl., Вы писали:

wl.>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


Уже высказали много вариантов. Но, мне кажется, основная причина даже не в qt-шной модели памяти, а в том, что сигналы в Qt не будут работать без цикла обработки сообщений (за исключением некоторых частных случаев) в каждом потоке.
Второе ограничение — это некопируемый базовый класс от которого нужно наследоваться.
То есть, это частное решение с определённым, достаточно большим оверхедом.

P.S. по поводу moc компилятора — он не нужен для сигналов/слотов. Уже давно есть проект, который практически полностью его заменяет — https://github.com/woboq/verdigris
Отредактировано 30.06.2025 18:15 SaZ . Предыдущая версия .
Re[7]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: rudzuk  
Дата: 30.06.25 18:22
Оценка:
Здравствуйте, Философ, Вы писали:

Ф> Вот ты знаешь способ, которым можно отлючить эту "библиотечную" приблуду?


Редактируешь system.pas, пересобираешь RTL... Только зачем Это же просто диспетчеризация вызова метода. Тот же самый механизм используется для вызова динамических (не виртуальных) методов. Тот факт, что обработка оконных сообщений так красиво легла на древний механизм диспетчеризации не означает, что диспатчинг был сделан специально под нее (динамические методы еще в Turbo Pascal были). Кстати, во Free Pascal пошли дальше, там сообщения могут иметь строковый идентификатор.
avalon/3.0.2
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: rudzuk  
Дата: 30.06.25 18:22
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV> Пока не до таких мелочей — рефлексию внедряют.


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

А главное, зачем??
avalon/3.0.2
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Великий Мессия google
Дата: 30.06.25 18:57
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, LaptevVV, Вы писали:


LVV>> Пока не до таких мелочей — рефлексию внедряют.


R>Почитал статью на хабре про эту вашу рефлексию в сисплюсах. Парсинг джисона в компайлтайм это, конечно, круто, но...

R>А главное, зачем??

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

т.е. эти протобуфы, moc для QT итд все уберется

к примеру есть у тебя структура
что бы ее сериализвать
надо в ручную писать сериализатор к каждому полю
или выкручиваться через всякие хитрые SFINAE как это делал полухин и протянул в буст
теперь это не надо
средствами язык
можно добраться до всего что написано на С++
имя переменной к примеру в функции или в классе
ну итд
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: velkin Земля  
Дата: 30.06.25 19:04
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Почитал статью на хабре про эту вашу рефлексию в сисплюсах. Парсинг джисона в компайлтайм это, конечно, круто, но...

R>А главное, зачем??

Рефлексия в практическом плане нужна для того, чтобы создавать скрипты или иные управляющие структуры вроде машин состояний на основе уже скомпилированных библиотек. Сейчас к этому делу подвязали тот же Python, то есть вызывают библиотеке Си и C++ из него, но для этого нужна обёртка (wrapper) для него.

А если возвратиться в прошлое, то есть консорциум Object Management Group и продвигаемые технологии не только UML, но и какие-нибудь CORBA и DDS. Только в одном случае главное это удалённый вызов функций, а в другом управление через состояние данных.

У Майкрософт ещё была технология DCOM, кстати, довольно плохая вещь, когда на неё стали делать ставку производители оборудования для автоматизации. Я про ту дрянь под названием OPC сервера.

В общем лично я выделяю два направления как и написал выше.
1. Вызов.
2. Данные.

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

Но с точки зрения нормального сиплюсплюсника, который имеет код и компилирует его когда надо, конечно, всё это ерунда. Причём я сам не раз это писал в отношении тех же плагинов. Если производитель софта не может сам делать софт включая плагины, но последнее только чисто для удобства разработки и обновлений, а ему нужны сторонние разработчики, то это как бы такое себе.
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wander  
Дата: 30.06.25 19:06
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Почитал статью на хабре про эту вашу рефлексию в сисплюсах. Парсинг джисона в компайлтайм это, конечно, круто, но...

R>Image: 5acb9b38b1c7e32f706f27c6.jpg
R>А главное, зачем??

Я лично понял это как proof of concept. Короче, буквально не воспринимаю.
А статическая рефлексия сама по себе — это нужная штука.
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Igore Россия  
Дата: 02.07.25 13:27
Оценка:
Здравствуйте, rudzuk, Вы писали:

LVV>> Пока не до таких мелочей — рефлексию внедряют.


R>Почитал статью на хабре про эту вашу рефлексию в сисплюсах. Парсинг джисона в компайлтайм это, конечно, круто, но...

R>Image: 5acb9b38b1c7e32f706f27c6.jpg
R>А главное, зачем??
Уже написали, просто добавлю. Чтобы избавится от внешних инструментов(шагов)
Qt(moc), protobuf(protoc), odb, ну и появятся новые всякие ORM
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: · Великобритания  
Дата: 03.07.25 08:59
Оценка:
Здравствуйте, Igore, Вы писали:

R>>А главное, зачем??

I>Уже написали, просто добавлю. Чтобы избавится от внешних инструментов(шагов)
А зачем от них избавляться?

I>Qt(moc), protobuf(protoc), odb, ну и появятся новые всякие ORM

Эти самые protobuf генераторы делают для всех языков, даже таких как c#/java/etc в которых и с рефлексией всё в порядке, и даже встроенная кодогенерация есть. И даже для js есть генераторы.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: · Великобритания  
Дата: 03.07.25 10:19
Оценка:
Здравствуйте, velkin, Вы писали:

R>>Почитал статью на хабре про эту вашу рефлексию в сисплюсах. Парсинг джисона в компайлтайм это, конечно, круто, но...

R>>А главное, зачем??
V>Рефлексия в практическом плане нужна для того, чтобы создавать скрипты или иные управляющие структуры вроде машин состояний на основе уже скомпилированных библиотек.
А как дела обстоят в С++ с компилированными библиотеками? Хоть бинарную совместимость-то осилили? И замутить рефлексию даже возможно??!
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Igore Россия  
Дата: 04.07.25 07:44
Оценка:
Здравствуйте, ·, Вы писали:

R>>>А главное, зачем??

I>>Уже написали, просто добавлю. Чтобы избавится от внешних инструментов(шагов)
·>А зачем от них избавляться?

I>>Qt(moc), protobuf(protoc), odb, ну и появятся новые всякие ORM

·>Эти самые protobuf генераторы делают для всех языков, даже таких как c#/java/etc в которых и с рефлексией всё в порядке, и даже встроенная кодогенерация есть. И даже для js есть генераторы.
Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется?
Re[6]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: · Великобритания  
Дата: 04.07.25 08:24
Оценка:
Здравствуйте, Igore, Вы писали:

I>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется?

Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 04.07.2025 8:26 · . Предыдущая версия .
Re[7]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 04.07.25 14:15
Оценка:
Здравствуйте, ·, Вы писали:


I>>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется?

·>Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции.

Если я правильно понимаю, интерполяция строк там в каких-то стандартных конструкциях, так?

А на плюсах можно будет самому написать
Маньяк Робокряк колесит по городу
Re[8]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: · Великобритания  
Дата: 04.07.25 14:24
Оценка:
Здравствуйте, Marty, Вы писали:

I>>>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется?

M>·>Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции.
M>Если я правильно понимаю, интерполяция строк там в каких-то стандартных конструкциях, так?
Нет, в Rust есть макросы.

M>А на плюсах можно будет самому написать

А как этому поможет рефлексия? Рефлексия это доставать имена всякой всячины, классы, функции, поля. Для интерполяции нужно уметь захватывать значение локальной переменной (как в rust) или в общем случае — значение любого выражения.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[9]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 04.07.25 14:26
Оценка:
Здравствуйте, ·, Вы писали:

I>>>>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется?

M>>·>Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции.
M>>Если я правильно понимаю, интерполяция строк там в каких-то стандартных конструкциях, так?
·>Нет, в Rust есть макросы.

Если через макросы можно написать интерполяцию строк, то это рефлекция, как ни крути


M>>А на плюсах можно будет самому написать

·>А как этому поможет рефлексия? Рефлексия это доставать имена всякой всячины, классы, функции, поля. Для интерполяции нужно уметь захватывать значение локальной переменной (как в rust) или в общем случае — значение любого выражения.

Это тоже рефлексия
Маньяк Робокряк колесит по городу
Re[10]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: · Великобритания  
Дата: 04.07.25 14:39
Оценка:
Здравствуйте, Marty, Вы писали:

M>Если через макросы можно написать интерполяцию строк, то это рефлекция, как ни крути

Это какое-то словоблудие. Неясно как такое понимание согласуется с фактом: "В Rust есть интерполяция, но нет рефлексии. В Java есть рефлексия, но нет интерполяции."

Ты наверное путаешь рефлексию с метапрограммированием. Или показывай как через макросы в Rust напечатать имя функции, например.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[11]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 04.07.25 14:59
Оценка:
Здравствуйте, ·, Вы писали:

M>>Если через макросы можно написать интерполяцию строк, то это рефлекция, как ни крути

·>Это какое-то словоблудие.

Никакого словоблудия.


·>Неясно как такое понимание согласуется с фактом: "В Rust есть интерполяция, но нет рефлексии.


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


·>В Java есть рефлексия, но нет интерполяции."


Если есть рефлексия, то можно написать интерполяцию. Возможно, никому просто там это не нужно


·>Ты наверное путаешь рефлексию с метапрограммированием.


Может и путаю. Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию?


·>Или показывай как через макросы в Rust напечатать имя функции, например.


Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии
Маньяк Робокряк колесит по городу
Re[12]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: · Великобритания  
Дата: 04.07.25 15:25
Оценка:
Здравствуйте, Marty, Вы писали:

M>·>Неясно как такое понимание согласуется с фактом: "В Rust есть интерполяция, но нет рефлексии.

M>Потому что рефлексия в каком-то виде есть, вероятно, сильно ограниченная. Без рефлексии (возможности программы к доступу к информации о собственной структуре) не очень представляю, как можно обратиться к локальным переменным.
Ну так разберись как макросы работают. И почему они называются макросами, а не рефлексией.
Это в каком-то смысле сишный препроцессор, но только сделанный по-человечески. Называть сишний препроцессор рефлексией у тебя наглости не хватит, надеюсь.

M>·>В Java есть рефлексия, но нет интерполяции."

M>Если есть рефлексия, то можно написать интерполяцию.
Нельзя.

M>·>Ты наверное путаешь рефлексию с метапрограммированием.

M>Может и путаю.
Не сомневайся. Метапрограммирование — это очень общий термин. В плюсах то что ты назвал метапрограммированием, это ещё один частный случай: https://en.wikipedia.org/wiki/Template_metaprogramming

M>Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию?

Только после того, как ты мне покажешь как в java через рефлексию написать интерполяцию.

M>Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии

Нет, это говорит лишь о том, что ты плохо разбираешься в терминологии.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 04.07.25 16:05
Оценка:
Здравствуйте, ·, Вы писали:

·>Ну так разберись как макросы работают. И почему они называются макросами, а не рефлексией.


Зачем бы мне это?


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


Вот именно, что "в каком-то виде".

Рефлексия — это тоже в каком-то виде сишный препроцессор, но только сделанный по-человечески.



M>>·>В Java есть рефлексия, но нет интерполяции."

M>>Если есть рефлексия, то можно написать интерполяцию.
·>Нельзя.

С фига ли? Что мешает?


M>>Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию?

·>Только после того, как ты мне покажешь как в java через рефлексию написать интерполяцию.

В java есть возможность через рефлексию получить доступ к локальным переменным текущей функции/фрейма? Тогда нет проблем.

На Java я конечно ничего писать не буду, но приведу тебе другой пример. У меня есть библиотека marty::format. Там у меня есть возможность обращаться к аргументам по имени. Для этого есть специальный тип marty::format::Args — он хранит список аргументов в том порядке, в котором в него их поместили, за счёт чего можно к ним обращаться по индексу, и, дополнительно, там внутри есть ассоциативный массив, в котором хранятся связи имя->индекс, и за счёт этого и происходит обращение к аргументам по имени.
Если в плюсах появится рантайм-рефлексия, я легко переделаю этот код на код с интерполяцией, и выкину marty::format::Args. У меня разбор форматной строки делается в рантайме, потому мне нужна рантайм-рефлексия, но если бы разбор форматной строки был бы в компайл-тайм, то и интерполяция была бы времени компиляции (судя по всему, некоторые возможности компайл-тайм-рефлексии называют интроспекцией, ну окай, пусть будет интроспекция, хотя почему тогда в плюсах её называют рефлексией?).

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


M>>Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии

·>Нет, это говорит лишь о том, что ты плохо разбираешься в терминологии.

Или ты

  1. Есть ли в языке Rust рефлексия?

  2. Что из себя представляют макросы Rust?


  3. Интерполяция строк в Rust

DeepSeek говорит, что а) есть интроспекция — костыльная недо-рефлексия б) интерполяции в расте нет
Хз, может, и врёт
Маньяк Робокряк колесит по городу
Re[14]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
От: · Великобритания  
Дата: 04.07.25 18:53
Оценка:
Здравствуйте, Marty, Вы писали:

M>·>Ну так разберись как макросы работают. И почему они называются макросами, а не рефлексией.

M>Зачем бы мне это?
Ты написал "не очень представляю". Я думал ты хотел разобраться, похоже, я ошибся.

M>·>Это в каком-то смысле сишный препроцессор, но только сделанный по-человечески. Называть сишний препроцессор рефлексией у тебя наглости не хватит, надеюсь.

M>Вот именно, что "в каком-то виде".
Не понял. В каком таком виде?

M>Рефлексия — это тоже в каком-то виде сишный препроцессор, но только сделанный по-человечески.

Нет. Читай доки, они рулез. Начни хоть с вики, ссылку уже давал.

M>>>Если есть рефлексия, то можно написать интерполяцию.

M>·>Нельзя.
M>С фига ли? Что мешает?
Отсутствие возможности.

M>>>Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию?

M>·>Только после того, как ты мне покажешь как в java через рефлексию написать интерполяцию.
M>В java есть возможность через рефлексию получить доступ к локальным переменным текущей функции/фрейма? Тогда нет проблем.
Нельзя.

M>Не вижу проблем сделать аналогичное на Java.

Это не интерполяция строк, а обычный Map<String, V>. Для этого не нужна ни рефлексия, ни доступ к локальным переменным, ни макросы, ни метапрограммирование вообще.

M>>>Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии

M>·>Нет, это говорит лишь о том, что ты плохо разбираешься в терминологии.
M>Или ты
Нет.

M>DeepSeek говорит, что а) есть интроспекция — костыльная недо-рефлексия

Это ты врёшь. Он говорит: "не имеет рефлексии". Но в некотрых сценариях можно использовать _альтернативные_ механизмы, которые не рефлексии. Иными словами, для некоторых задач, где в какой-нибудь java можно было бы использовать рефлексию, в Rust можно воспользоваться другими механизмами для достижения похожих результатов. В качестве аналогии: если тебе надо скрепить две деревяшки шурупом, но отвёртки нет, можно заколотить молотком. Чтобы из этого сделать вывод, что молоток — это костыльная недо-отвёртка, надо иметь альтернативную одарённость.

M>б) интерполяции в расте нет

M>Хз, может, и врёт
Да, врёт. Открой хоть доку:
let people = "Rustaceans";
format!("Hello {people}!");       // => "Hello Rustaceans!"
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: m2user  
Дата: 05.07.25 16:14
Оценка:
wl.>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся

А что ты там общее с C# увидел?
Ключевое слово event? Но это не то же самое, что signal.

Аналогов thread affinity для объектов, асинхронного выполнения слотов (Qt::QueuedConnection) и др. QT конструкций я в C# в явном виде не наблюдаю.
Ну разве что System.Windows.Forms.Control.Invoke для многопоточной работы с Windows Forms
(https://learn.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls#example-use-the-invoke-method)
Re[2]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: wl. Россия  
Дата: 05.07.25 18:24
Оценка:
Здравствуйте, m2user, Вы писали:

wl.>>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся


M>А что ты там общее с C# увидел?


вот гопота отвечает:

В C# есть функционал, аналогичный Qt signal/slot — это делегаты и события (delegates и events). Они позволяют реализовать схему публикации-подписки, когда один объект может уведомлять другие о наступлении определённых событий, очень похожую на механизм сигналов и слотов в Qt.

Пример:


// Объявление делегата (аналог сигнала)
public delegate void CounterEvent(int newValue);

// Класс, генерирующий событие
class Counter
{
    private int mValue;
    public event CounterEvent Changed; // Аналог сигнала

    public void Set(int v)
    {
        mValue = v;
        Changed?.Invoke(v); // Аналог emit
    }
}

// Класс-подписчик (аналог слота)
class CounterUser
{
    private Counter counter;

    public CounterUser()
    {
        counter = new Counter();
        counter.Changed += CounterChanged; // Аналог connect
    }

    private void CounterChanged(int newValue)
    {
        Console.WriteLine("Counter changed: " + newValue);
    }
}

event — объявляет событие (аналог сигнала).

+= — подписывает обработчик (аналог подключения слота).

Invoke — вызывает всех подписчиков (аналог emit).

Особенности:

* В C# можно подписывать несколько обработчиков на одно событие (multicast delegates), как и несколько слотов на один сигнал в Qt.

* Можно использовать стандартный EventHandler или создавать собственные делегаты с нужными параметрами.

* В отличие от Qt, синтаксис событий и делегатов встроен в язык и не требует внешней генерации кода.

Вывод:
В C# функционал событий и делегатов полностью покрывает типичные задачи signal/slot из Qt и считается стандартным способом реализации реактивного взаимодействия между объектами
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: m2user  
Дата: 05.07.25 20:20
Оценка:
wl.>В C# функционал событий и делегатов полностью покрывает типичные задачи signal/slot из Qt и считается стандартным способом реализации реактивного взаимодействия между объектами

Задачи схожие. Остальное все разное.
(если бы ты дал ссылку на источник, с которого обучился AI, можно было попытаться понять мысль автора).

delegate — это аналог указателя на функцию в C++.
event — это не более, чем синтаксический сахар для хранения списка делегатов, которые будут вызваны при срабатывания event`а (последовательно в цикле в том же потоке выполнения)

Для сравнения в Java даже и этого нет: есть просто паттерн, по которому разработчик сам реализует аналогичный список, но не делегатов, а объектов, реализующих некий интерфейс с одним методом.
(и делегатов в Java тоже соотвественно нет).

Иными словами подобную тривиальную конструкцию как в C#/Java тебе ничего не мешает реализовать и в C++ без изменений в стандарте.

Что же касается QT: слоты и сигналы это не просто внешняя кодогенерация, но и особая "магия" при вызове слотов:
https://doc.qt.io/qt-6/threads-qobject.html#signals-and-slots-across-threads

Qt supports these signal-slot connection types:

— Auto Connection (default) If the signal is emitted in the thread which the receiving object has affinity then the behavior is the same as the Direct Connection. Otherwise, the behavior is the same as the Queued Connection."
— Direct Connection The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter's thread, which is not necessarily the receiver's thread.
— Queued Connection The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
— Blocking Queued Connection The slot is invoked as for the Queued Connection, except the current thread blocks until the slot returns.

Note: Using this type to connect objects in the same thread will cause deadlock.
— Unique Connection The behavior is the same as the Auto Connection, but the connection is made only if it does not duplicate an existing connection. i.e., if the same signal is already connected to the same slot for the same pair of objects, then the connection is not made and connect() returns false.


Т.е. функция-слот может вызываться как в потоке эммитера (синхронно), так и в потоке объекта-получателя (синхронно или асинхронно) в зависимости от thread affinity объекта-получателя.

В C#/Java нет таких встроенных механизмов: thread affinity объектов и автоматического вызова подписчиков на event в другом потоке.
qt
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 05.07.25 20:31
Оценка:
Здравствуйте, m2user, Вы писали:

M>delegate — это аналог указателя на функцию в C++.

M>event — это не более, чем синтаксический сахар для хранения списка делегатов, которые будут вызваны при срабатывания event`а (последовательно в цикле в том же потоке выполнения)

Как я понял, это не совсем так. Делегат — это список из std::function, которые будут вызваны в цикле при срабатывании event`а
Маньяк Робокряк колесит по городу
Re[5]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: m2user  
Дата: 05.07.25 22:41
Оценка:
M>Как я понял, это не совсем так. Делегат — это список из std::function, которые будут вызваны в цикле при срабатывании event`а

Нет, тип делегат в C#, это аналог type alias`а функции в C/C++.

C#:
delegate void CounterEvent(int newValue);

C++:
typedef int CounterEvent(int newValue);
или
using CounterEvent = int(int newValue);
Re[6]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 05.07.25 22:54
Оценка:
Здравствуйте, m2user, Вы писали:

M>>Как я понял, это не совсем так. Делегат — это список из std::function, которые будут вызваны в цикле при срабатывании event`а


M>Нет, тип делегат в C#, это аналог type alias`а функции в C/C++.


M>C#:

M>
M>delegate void CounterEvent(int newValue);
M>

M>C++:
M>
M>typedef int CounterEvent(int newValue);
M>
или

M>
M>using CounterEvent = int(int newValue);
M>



Ещё раз, как я понял, делегат в шарпе — это прежде всего список чего-то вызываемого. Что может быть вызываемым — это второй вопрос.

В C++ std::function предоставляет всем пользователем единый интерфейс для вызова — определенный тип возврата, и определённые аргументы в определенном количестве.

Внутри себя std::function может хранить лямбду, указатель на функцию, указатель на метод класса (и, соответственно, указатель на экземпляр класса), но он вызывает это все через единый интерфейс.

Тип возврата и аргументы, как я понимаю, должны соответствовать тому, что содержит event и что он возвращает (но тут не понятно, если обработчиков много, результат которого из них вернётся туда, где было инициированно событие?)

А то, что ты привел, это типы обработчиков события, которые могут быть присвоены делегату (а на самом деле добавлены в список вызовов)
Маньяк Робокряк колесит по городу
Re[5]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Артём Австралия жж
Дата: 05.07.25 23:38
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.


Солевые наркоманы
Re[6]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.07.25 00:05
Оценка: +1
Здравствуйте, Артём, Вы писали:

Ф>>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.


Аё>Солевые наркоманы


Нет, это вы наркоманы, потому что в дельфях ничего такого не было
Маньяк Робокряк колесит по городу
Re[7]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Артём Австралия жж
Дата: 06.07.25 00:59
Оценка:
Здравствуйте, Marty, Вы писали:

M>Нет, это вы наркоманы, потому что в дельфях ничего такого не было


По ссылке почитай.
Re[8]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 06.07.25 01:08
Оценка:
Здравствуйте, Артём, Вы писали:

M>>Нет, это вы наркоманы, потому что в дельфях ничего такого не было


Аё>По ссылке почитай.


Давай ты сам для начала попробуешь почитать, что там по ссылке?
Маньяк Робокряк колесит по городу
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: m2user  
Дата: 06.07.25 01:15
Оценка:
ВМ>>за пределами куте, они нигде не используются
ВМ>>щарп не просто язык
ВМ>>там и гуи насколько я понимаю

wl.>так сигналы это не только GUI — асинхронная работа сети та же, но тут, конечно, ASIO тоже не часть стандарта С++


Что касается асинхронной работы с сетью: в C# есть 3 паттерна разработки асинхронных API: TAP, EAP, APM (https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/).

Из них на event`ы полагается EAP (Event-based Asynchronous Pattern).
https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/event-based-asynchronous-pattern-overview#examples-of-the-event-based-asynchronous-pattern
  пример
public class AsyncExample  
{  
    // Synchronous methods.  
    public int Method1(string param);  
    public void Method2(double param);  
  
    // Asynchronous methods.  
    public void Method1Async(string param);  
    public void Method1Async(string param, object userState);  
    public event Method1CompletedEventHandler Method1Completed;  
  
    public void Method2Async(double param);  
    public void Method2Async(double param, object userState);  
    public event Method2CompletedEventHandler Method2Completed;  
  
    public void CancelAsync(object userState);  
  
    public bool IsBusy { get; }  
  
    // Class implementation not shown.  
}

Идея EAP в том, что об окончании работы асинхронного метода пользователь API узнает через подписку на event.
Как можно заметить, то же самое можно было организовать через передачу callback`а в асинхронный метод (что паттерне APM и делается).

Отдельно отмечу, что в случае необходимости вызова подписчика event`а в другом потоке, ответственен за это сам разработчик (хотя для этого и предлагаются вспомогательные классы).
См. https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.asyncoperationmanager?view=net-9.0#remarks

If your class needs to provide asynchronous behavior according to the Event-based Asynchronous Pattern Overview, you will encounter a number of concurrency management issues.
Among these is the requirement to ensure that event handlers are called on a thread or context that is appropriate for the application model (for example, Windows Forms applications, ASP.NET applications, console applications, and so on). The AsyncOperationManager provides a convenient way to create a class that runs properly under all application models supported by the .NET Framework.

См. https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/component-that-supports-the-event-based-asynchronous-pattern#implementing-the-completion-method

The completion delegate is the method that the underlying, free-threaded asynchronous behavior will invoke when the asynchronous operation ends by successful completion, error, or cancellation.
This invocation happens on an arbitrary thread.

This method is where the client's task ID is removed from the internal collection of unique client tokens. This method also ends the lifetime of a particular asynchronous operation by calling the PostOperationCompleted method on the corresponding AsyncOperation.
This call raises the completion event on the thread that is appropriate for the application model. After the PostOperationCompleted method is called, this instance of AsyncOperation can no longer be used, and any subsequent attempts to use it will throw an exception.

Re[7]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: m2user  
Дата: 06.07.25 10:08
Оценка:
M>Ещё раз, как я понял, делегат в шарпе — это прежде всего список чего-то вызываемого. Что может быть вызываемым — это второй вопрос.

Возможно ты имеешь в виду то, что к делегатам одного типа (сигнатуры) применим операторы +/- (они же методы Combine/Remove класса Delegate).
И результатом сложения является т.н. multicast делегат того же типа (сигнатуры), но при его вызове будут последовательно вызваны все слагаемые.

M>Тип возврата и аргументы, как я понимаю, должны соответствовать тому, что содержит event и что он возвращает


собственно event и определяется через тип делегата.

M> (но тут не понятно, если обработчиков много, результат которого из них вернётся туда, где было инициированно событие?)


типовая имплементация эвента в C# не предполагает, что обработчик что-то возвращает.

M>А то, что ты привел, это типы обработчиков события, которые могут быть присвоены делегату (а на самом деле добавлены в список вызовов)


ну да, делегат это и есть тип (и определяется сигнатурой функции, как std::function<>). То что делегаты можно складывать и вычитать, вызывать как функции, а также использовать как объекты класса Delegate это всё синтаксический сахар и compiler generated code.
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Skorodum Россия  
Дата: 07.07.25 11:07
Оценка:
Здравствуйте, velkin, Вы писали:

V>А про то, что на Qt код нужно не писать, а попросту использовать и так понятно, но и производительности как в обобщённом программировании не жди. Я когда писал про if и switch намекал, что Qt как бы не пытается в производительность. И сигналы и слоты это довольно тормознутая штука сочетающая генерацию кода и очереди. Вот потому она и не попадёт в стандарт именно из Qt.

Генерация кода производительности времени выполнения совершенно ортогональна.
Про тормознутость сильно спорное утверждение: Qt-шный COW + Qt-шные сигналы/слоты на самом деле дают производительность которая покрывает, как минимум, 80% потребностей. Далеко не все программисты напишут сходный функционал с заметно лучшей производительностью, а, те, кто такинапишут потрят на порядки больше времени.

V>А даже если и захочет, то появилось куча мусорной литературы. Я бы даже сказал так, поколение программистов пользователей может даже не понимать, что у них в образовании имеются некие проблемы, да и не для всех это действительно проблемы.

Конечно, как и другие категории программистов могут не понимать паттернов использования фреймворка.
qt
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.