Задать вопрос
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, для информации.
    Тут только прототип коллбека, т.е. тот же функтор. Все описано в репке. Не советую использовать этот код, я не задумывал его для использования в проектах.
    Возможно код натолкнет тебя на какие-нибудь выводы. В моем коде все многократно серьезнее чем в этом прототипе, но событие и коллбек сделаны схожим с прототипом образом.
    Ну и советую посмотреть на libsigc++ еще.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, требуй от пользователя только минимальную информацию для работы твоего кода.
    Выводи недостающие для работы твоего кода части исходя из полученной от пользователя информации своими руками.
    Тебя ведь ничто не останавливает от того, чтобы самостоятельно инстанцировать функтор из std::function из параметров шаблона события.

    У тебя д.б. так:
    template< typename >
    class Event;


    Частичная специализация защищает тебя от пользователя, которому захотелось странного.
    template< typename TResult, typename... TArguments >
    class Event<TResult ( TArguments... )> final
    {
    };


    Дальше в этом коде у тебя все сразу под контролем. Выведи тип функтора, откажись от шаблонов операторов, используй выведенный тип функтора в операторах, используй параметры TResult и TArguments для определения оператора функционального вызова.
    Шаблон простой как три копейки. Тебе незачем делать его сложнее. :)
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, так. Но зачем тебе std::function здесь? Для чего ты обязываешь своего пользователя инстанцировать шаблон события именно таким образом?
    Ведь это ни тебе(писателю шаблона), ни ему(пользователю шаблона) не нужно.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, но я ведь не ругался на саму шаблонность события. :)
    Я ругался только на то, что у шаблона класса события есть шаблоны методов. Ты контроль потерял только из-за этого и сейчас из-за этого же пытаешься свой код подотунуть костылями.
    Приведенный код никуда в плане качества не сдвинулся. Он такой же неудачный.

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

    Подумай, каким образом из template< typename > можно получить и тип результата функции, и типы всех ее параметров всего за одну частичную специализацию шаблона.
    Тебе не нужно передавать в событие тип хендлера.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, если разобрался, то и хорошо.

    Не будешь против моего личного мнения? :)
    Код Event никуда не годится. Он неконтролируемый вообще.
    Ты пишешь его как шаблон. В качестве аргумента инстанцирования передаешь тип хендлера, от которого внутри инстанцируешь тип поля - коллекцию хендлеров.
    И вот именно с этого момента у тебя все должно быть под контролем и полностью известно, но нет. не в твоем коде.

    void operator+=(auto&& handler)
    Это называется обобщенной функцией. Тут у тебя оператор. Он обобщенный. Что это значит?
    auto&& - это универсальное обобщение. Конкретный тип из него будет выведен в момент передачи аргумента.
    Конкретный оператор у тебя из обобщенного будет выведен для типа каждого из переданных для его вызова хендлеров. Буквально в этот оператор ты можешь передавать все что только захочется и код будет пытаться собраться. Внутри оператора, в строчке
    _handlers.emplace_front(std::forward<decltype(handler)>(handler));
    код будет пытаться привести переданный тобой хендлер к типу THandler.
    Насколько я вижу, ты используешь C++20 и тебе доступно неявное приведение стандартных функторов. В результате C++20 только усугубляет тебе проблему в коде, позволяя то, что ты написал.

    Что у нас дальше.
    template<typename TObject, typename TEventArgs> requires std::derived_from<TEventArgs, EventArgs>
    void operator()(TObject* sender, const TEventArgs& e) const

    Это шаблон оператора функционального вызова. Этот оператор из твоего события делает функциональный объект или функтор.
    Но у тебя это шаблон. А инстанцируется он от любых аргументов, которые ты ему передаешь. И внутри кода шаблона у тебя код неявного приведения аргументов к типам параметров THandler.
    И этот процесс ты вообще никак не контролируешь.

    Этот код вообще никуда не годен. От него отказаться надо, наверное, прямо со вчера. Сегодня ты чуть-чуть переписал этот код, но по сути не сделал ничего полезного. И от этого кода все равно нужно отказаться.
    Вот такое мнение вызвал твой код у человека, который ежедневно через code review проживает добрых 4 часа своей рабочей жизни.
    Если спросишь про то, как тогда должно быть чтобы код был успешным, то я только предложу тебе изучить для начала как определяются и записываются типы функций и обратить пристальное внимание на то, как инстанцируются функторы из шаблона std::function. Постарайся разобраться с возможностями, которые тебе открывает мой совет.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    Dyikot, это оператор события?
    Покажи как целиком выглядит событие. У тебя довольно рваная передача информации сейчас, мне приходится додумывать из своего опыта и пока я совсем не вижу никаких проблем и необходимости, благодаря своему опыту. Т.е. я считаю что тебе эти типы знать не нужно.
    Тебе стоит точнее передать место твоей проблемы и как ты ожидаешь эту проблему решить через знание конкретных типов.

    Если _handlers это коллекция делегатов, то они у тебя все одного типа и тебе про них все итак известно.
    Написано
  • Можно ли узнать типы сигнатуры std::function?

    @MarkusD Куратор тега C++
    mayton2019, потому что RTTI )))
    Но это я просто вдогонку стиля беседы. В вопросе нет ни слова про RTTI, Дима на что-то свое подумал и вот так решил выразить свое мнение. Помогает ли его мнение хоть кому-то - вопрос отдельный. Особенно с учетом факта, что вопрос к RTTI даже косвенного отношения не имеет. Вопрос имеет крайне отдаленное отношение лишь к интроспекции, которая к RTTI тоже никакого отношения не имеет.

    А вот дальше будет по сути дела.
    Dyikot , вопрос у тебя понятный и даже обычный. Да, в общем случае можно узнать эти аргументы. Чтобы помочь тебе, сперва мне надо понять как ты хочешь распоряжаться полученной информацией. Допустим, у тебя уже есть знание об этих типах, пусть их будет даже не два, а заранее неизвестное N.
    Что у тебя по ним в планах дальше? Как хочешь с ними работать?
    Написано
  • Как мне получать файлы от пользователей?

    @MarkusD Куратор тега C++
    Ars_15, с++ и "стандартность" несовместимы. Есть только один стандарт - стандарт C++. Остальное все отдается на откуп пользователям.
    Тебе стоит дополнить свой вопрос информацией. Ты написал про проект и пользователей. Пользователи и проект на одном ПК работают? Или на разных?
    Начнем с ответа на этот вопрос.
    Написано
  • Как считать числа из текстового файла в массив на с++?

    @MarkusD Куратор тега C++
    Aleks_Kuzo, если помогло, ответ надо пометить как решение.
    Написано
  • На каких движках пишут симуляторы?

    @MarkusD Куратор тега C++
    Дмитрий Забелин
    баллистический симулятор с учетом сопр воздуха, аэродинамики снаряда и т.д

    Т.е. то, что Team17 30 лет назад сделали в червяках под Amiga и без каких-либо движков?
    Написано
  • Почему двоится изображение на мониторе?

    SpecteRED, хорошо. Теперь резюмируем по состоянию на этот момент.
    Проблема возникает только в одной игре. Проблема возникает с хаотичной периодичностью. Строгой последовательности с хотя бы 50% повторением проблемы нет.
    При захвате экрана со стороны ОС проблема не наблюдается.
    Проблема повторяется при смене GPU даже на другое семейство. Проблема повторяется при любом доступном транспорте: как на DP, так и на HDMI. Проблема повторяется при выводе на монитор. Проблема повторяется при замене монитора.

    Внутриигровые настройки будут влиять только косвенно. Эксперимент дал некоторые ответы. Винда "виснет" в ожидании обратной связи, которую декодер монитора после своего перезапуска уже не даст.
    Проблема находится сразу в двух местах. Первое место - это декодер сигнала в мониторе. Он отключается из-за того, что ему приходит по кабелю, а затем сторожевая собака его включает обратно уже с потерей качества. Второе место - это, все-таки, игра. Именно игра генерирует данные для недопустимого для декодера сигнала.
    Еще источником проблемы может быть что-то третье. Статические токи в принципе очень опасны для электроники, а взяться могут почти откуда угодно.

    Что делать дальше и как жить. Лично я бы уже после третьего такого глюка дропнул игру. Не стоит она того, чтобы мое железо от нее сбоило.
    Найди репродукцию проблемы хотя бы с 50% шансом. Вторым шагом надо эту репродукцию растиражировать по игрокам и собрать обратную связь о проблеме. После этого репродукцию надо отправлять разработчикам для наблюдения и исправления проблемы.
    Написано
  • Почему двоится изображение на мониторе?

    SpecteRED, ну ок. Давай еще пальцем тыкнем вот куда. Vsync.
    Включена ли вертикальная синхронизация в игре? Если да - отключаем и передергиваем DP на горячую при двоении на мониторе. Для уверенности можно и на HDMI перекинуться для этого.
    Ось виснет не от хорошей жизни. У HDMI и DP механизмы обратной связи малость разные. Если моник провалит реакцию в нужный момент, драйвер оси не выведет ее из особого режима работы. Снаружи это выглядит как повисание оси.
    А еще надо бы посмотреть логи драйвера в этот момент.
    Написано
  • Почему двоится изображение на мониторе?

    SpecteRED,
    С учетом этого есть еще варианты?

    Вариантов вообще нет. :) Оборудование находится у тебя в руках и только тебе ведомо что с ним творится. По своему опыту подобных расследований знаю что словам владельца верить нельзя вообще. Прихожу сам, делаю ровно те же тесты и проблема находится в два счета. А человек делал по-своему и что-то позабыв сделать/рассказать ровно с тем же расчетом: "Не думаю что это что даст".

    Погасание монитора может говорить о том, что его декодер словил от GPU недопустимые данные. Как правило это недопустимый для отображения цвет в какой-то конкретной области монитора. Искажение картинки после погасания может говорить о рассинхронизации уже самого монитора. Пробуем отключить и подключить DP на горячую, без ребута.
    Про погасание монитора - тонкость упущенная. Даже боюсь представить сколько еще у тебя из рассказа выкинуто за ненадобностью. :) Это все сводит любые мои слова к банальному гаданию на кофейной гуще.
    Написано
  • Возможно ли проверить является ли T std::function?

    @MarkusD Куратор тега C++
    А на лямбду тебе проверка не нужна?
    Написано
  • Почему двоится изображение на мониторе?

    SpecteRED, отсутствие двоения при внутреннем захвате сразу исключает всю цепочку от игры и до драйвера GPU.
    Далее тебе надо сделать ряд тестов. Самостоятельная диагностика таких проблемы без знаний - это та еще морока.
    Первое - это после начала двоения выключить монитор и включить снова. После включения проверить двоение. Современные мониторы выключить можно двумя способами. Нужно обоими, один способ за один тест. Второй способ - это после обычного выключения вынуть кабель питания больше чем на 30 секунд.
    Второе - подключить телек как первый монитор. Подключить его как единственный монитор. Перекинуть кабель с монитора на телек после начала двоения. Одно действие - один чистый тест, т.е. начинаем с состояния отсутствия проблемы. После каждого действия проверять наличие или отсутствие двоения.
    Третье - поменять видюху. RTX 4070 Ti - это проблема сама по себе. Отвал оси при работе через HDMI может сказать о проблемах с памятью видеокарты. 4070 шальные просто сами по себе, а у Ti вообще регулярно кукушечка отлетает даже если тушка от хорошего бренда. Про китайщину даже говорить не приходится.
    Четвертое - снять телеметрию GPU во время игры и точно определить время начала двоения. По телеметрии будет хорошо видно, какие изменения в состоянии видеокарты приводят к проблеме.
    Написано
  • Какой вариант на ваш взгляд лучше для интерфейса?

    @MarkusD Куратор тега C++
    Dyikot, не-не. Ты на месте топчешься.
    У тебя в чем проблема же? Тебе maaGames все очень хорошо описал. Ты в сокет как будешь читать и писать? А в буфер свободной памяти?
    Первое дело - это объект, в который будет выполняться сериализация и из которого будут браться данные для десериализации. Это - шаблон потока (stream).
    Второе - это формат сериализации. Тебе требуется во всех деталях понять шаблон посетителя (visitor).
    Третье - это пейлоад, т.е. сериализуемый объект и цель десериализации. Для него есть шаблон сериализуемого (serializable).

    const std::string& delimetr - зачем эту сугубо приватную тонкость формата знать внешнему коду?
    Пока в коде у тебя видно что ты не совсем представляешь себе как все должно работать. Тебе не хватает структуры в голове сперва, поэтому код выглядит рваным.
    Написано
  • Какой вариант на ваш взгляд лучше для интерфейса?

    @MarkusD Куратор тега C++
    Dyikot, думаю, тебе уже понятно что никакой из обоих твоих вариантов не лучше. Потому что они оба одинаковы и одинаково плохие.
    Имена выбраны плохо. Из-за этого твой код вводит в заблуждение. std::any используешь не по назначению. SerializationData - это костыль как есть и назван отвратно. Какой шаблон проектирования применяешь - тебе и самому не ясно. А применяешь ты его не по месту и полностью неправильно.
    Только не думай что для тебя лично ситуация сейчас сложилась плохо. Извлекай опыт и становись грамотнее.
    Ответ на твой вопрос: оба варианта - дно. А вопроса "как надо" от тебя не было. Поэтому качественных вариантов не предлагаю.
    В сети просто море документов про сериалиацию. Мне этого хватило для выработки своей системы ценностей. Тебе тоже должно хватить. Но если задашь правильный вопрос, я на него отвечу.
    Написано
  • Данные в таком случае будут хранится в стеке?

    @MarkusD Куратор тега C++
    Dyikot, потому что давай подумаем что же ты в этой строчке написал.
    Написано
  • С++ автоматически вставляет в функцию ссылку на вектор?

    @MarkusD Куратор тега C++
    Алескей Дворяшин
    в качестве аргумента функции в самом объявлении функции указана ссылка.

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

    Как так то? C++ автоматически берет ссылку?

    C++ - это язык. Работу выполняет транслятор. Ни один из них ничего сам без просьбы не делает. Язык так и вовсе лишь стандартом представлен.
    Сам что-либо делает только писатель кода. Вот как ты написал, так транслятор код согласно стандарту языка и обработает. Это ты написал передачу по ссылке, транслятор просто обработал код согласно стандарту.
    Написано
  • Почему статическая переменная инициализируется дважды?

    @MarkusD Куратор тега C++
    Quark, я нередко прошу уточнения для того, чтобы сам автор вопроса лучше разобрался в своем вопросе.
    Сейчас ты не просто опустил в тексте важную информацию, а буквально выкинул ее для себя из внимания.
    А это значит что ты обречен на рецидив проблемы. В следующий раз она снова для тебя станет нерешаемой и снова потому что ты отказался от важных деталей проблемы.
    Поэтому лучше будет поменять текст вопроса и добавить важную деталь, на которую я сослался.
    У меня совсем не было бы к тебе вопросов, если бы ты написал имена файлов, в которых находятся обозначенные у тебя глобалы, привел бы выражения инициализации этих глобалов и показал конструкторы типов этих глобалов.
    Для меня это бы означало что ты увидел проблему целиком.
    Написано