Dyikot,
А вообще, функция разве может быть типом? Кажется, не может: int Func1() и int Func2() - один и тот же тип. А вышеназванный _Filter_fn используется как тип в шаблоне.
Dyikot, Да, я вас неправильно понял. Ещё не изучал 20-23 стандарт, поэтому не понял вопрос.
Глянул про их, конкретно на ваш вопрос ответ ещё проще: адаптеры можно объединять через | и делать составной. То есть не делать функию обёртку, вызывающую несколько функций, а в вызове написать A|B|C.
Но и всё вышесказанное мной про функторы не отменяется, если какое-то особо извращённое поведение объекта range_adaptor_closure понадобится, можно в функторе что-то хранить и возвращать наружу.
Dyikot, Хранятся в другом объекте и передаются как? Через какой-то внешний объект, глобальную переменную, синглтон? В алгоритмы передаётся контейнер и функтор. Как вы в функтор передадите "другой view-объект", если у вас фукнция, а не функтор? Лямбды не считаются, это опять же функтор со своим состоянием, а не обычня функция.
А я пишу не про данные контейнера, а про данные функтора. Который как бы stateless, но если очень надо, то он может быть очень даже stateyes.
Давай, чтобы точно говорить об одном и том же. Вызывается ranges::sort и надо посчитать, сколько перестановок делается (допустим, что это зачем-то надо). И этих ranges::sort одновременно вызывается в куче потоков больше одной штуки. Как вы это сделаете, передавая фукнцию сравнения, а не объект с состоянием? А очень просто! Нужно завести глобальный map, связывающий указатель на контейнер со счётчиком и в функции сравнения брать нужный счётчик... А указателя на контейнер нет в функции сравнения... Упс...
Dyikot, Да, в правы, функтор передаётся по значению. Но это не мешает передавать дополнительные данные вместе с функтором, чтобы они использовались алгритмами. Например, для сравнения вещественных чисел можно передавать точность сравнения. И не через глобальную переменную, а для каждого отдельного контейнера свою (привет от многопоточной обработки контейнеров с разными величинами погрешнсоти сравнения).
stateless тоже легко обходится, если состояние функтора хранить в shared_ptr, тогда можно дополнительную информацию наружу возвращать. Но придётся переписать move-конструктор, чтобы он не попортил указатели.
res2001, Совершенно верно. но тут мы уже подключаем или сокеты или ещё какие-то стредства непосредственного обмена собщениями между тремя процессами. С тем же успехом можно и между двумя процессами сообщения передавать синхронизирующие. Интересовало именно простейшая синхрлнизация между процессами, как это возможно для потоков именно средствами std, без сторонних (или самописных) библиотек.
Mercury13, Есть же куча библиотек, дающих кросплатформенное решения, абсрагируя от API конкретной ОС. В том же Qt есть QSahredMemory и QSystemSemaprore. Не знаю, QProcess через signal\slot синхронно или асинхроно работает. Всяких сторонних библиотек куча. Интересно было именно есть ли подобный функционал в std. Раз уж они взялись за многопоточность, может и для многопроцессорности что-то делают.
Mercury13, через строковый буфер ничем не поможет. один поток пишет int=11, второй int=22 и в консоли может оказаться "1212" хоть через буфер, хоть не через буфер. Так что или этот osyncstream или какие-нибудь мьютексы. Но про ввод в консоль это просто для примера.
Допустим, другой жизненный пример. Надо запретить запуск двух экзепляров приложения. Без WinAPI я не могу этого сделать "красиво". То есть можно файл в temp создавать и удалять при закрытии, но это костыли.
Mercury13, если бы оно было в стандарте и я бы об этом знал, то стал бы я спрашивать, есть ли такое в стандарте?
Но вот костыль через файл сработает, наверное. Создать пустой файл и открыать его на запись. Тогда второй процесс будет ждать, пока можно будет открыть на запись. Понятно, что можно ещё вебсокеты притянуть или ещё какие-то странные способы. Но мне стало интересно, может в современном С++23(26) уже что-то такое добавили. Особо не слежу за обновлениями.
например, когда два приложения пишут в один файл или в одну консоль. Знаю, что это звучит дикой архитектурой, но, если два приложения делают одну большую задачу, то мне удобно писать логи в один файл (одну консоль), а не в два. Можно писать в отдельные файлы с меткой времени, а потом два файла объединить в один, но хочется-то сразу. Межпроцессорным мьютексом синхронизировать запись.
res2001, не встречал упоминаний, что std::atomic и std::barrier подерживают процессы. Везде тлько про потоки.
Да и разделяемая память это уже API ОС, а не std\C++, а если всё-равно системное что-то испоьзовать, то как бы и изначально есть более удобные решения. Интересновало именно стандартное кроссплатформенное решение, а его нету. Раз нету, будем дальше использовать сторонние библиотеки.
rPman, а при чём тут Майкрософт? Не большой знаток Линуксов, там поток и процесс равнозначны в плане работы std::mutex?
Вот GUI в std крайне маловероятно что когда-то появится. Из boost кое-что тянут в std, но boost то открытый и бесплатный, а вот какой-нибудь Qt бесплатно никто не отдаст. А на что-то, кроме Qt-GUI, сообщество всё-равно не согласится :)
Если хочется кроссплатформенный байткод, то берём Java и пилим что хотим. Там и GUI свой инструментарий кроссплатформенный. Красота.
rPman, Да со сторними-то понятно. Чисто на Виндоус и WinAPI функций хватало. Просто столько всего в новые стандарты напихали, что мог недоглядеть. Значит и правда нет, а не я невнимательный.
Dyikot, а если не один nullptr надо проверить, а два?
Например: c.Parent()->Get()->Value();
Опять не подходит? То есть целый оператор ради одной строго фиксированной конструкции вводить, которая легко заменяется макросом?
Dyikot, Но ведь стандарт С++ не только для тебя пишут. Допустим, вот такой код:
auto cursor = c.Parent?.GetCursorOn() ?? c.Parent?.GetCursorOff();
Или всё, это уже слишком сложно и не будем оператор ??? вводить?
А мне вот хочется, чтобы в цикле for инкремент итератора был с условием. Сейчас для этого приходится while использовать, а хотелось бы в for как-нибудь по хитрому условие инкремента встроить. Чтобы отслеживало, перешло к следующей итерации автоматом или через continue. Предлагаю оператор о_0
А вообще, функция разве может быть типом? Кажется, не может: int Func1() и int Func2() - один и тот же тип. А вышеназванный _Filter_fn используется как тип в шаблоне.