чтобы итерироваться по ним? Смотрю на mem_fn но оно только для членов класса, а std::function требует явно указывать сигнатуру (или нет?). Сейчас просто вектор указателей всех функций, хочется отказаться от голых указателей но не пойму как
Нет ничего плохого в голых указателях на функции, если это указатели на свободные функции. std::function добавляет немного оверхеда. Явно сигнатуру указывать нужно (в общем-то как и в поинтерах)
Ключевое слово в предложении про оверхед "немного"
Одна лишняя аллокация не изменит мир в моём случае
Тогда std::function, но я все же считаю что поинтеры для свободных функций - ок
У меня мемберы и свободные функции вперемешку
Тогда std::function однозначно
А в чем будет принципиальная разница? То что std function спасёт от вызова после смерти this?
Разница по сравнению с чем? Если там мембер-функции в перемешку со свободными функциями, альтернатив нет
от такого вас никто не спасет)
Сейчас всё кастуется к указателям на члены поэтому альтернативы есть
Я бы не был так уверен)
Мы не будем вспоминать извращённые способы вроде enable_shared_from_this
К сожалению, это иногда единственный способ, например в asio :)
Ничуть. За всё время использования asio-асинхронщины почти всегда удавалось избегать этой жути.
Признаться, никогда указателями на методы не пользовался, разве у них тип не отличается от указателя на голую функцию с той же сигнатурой? Да и синтаксис вызова будет другой, как их можно хранить в одном контейнере?
Отличается тип но у нас есть касты. Поэтому можно
Ну вот уже некрасиво получается, уже один из плюсов замены на std::function - type erasure до абстрактного функтора
Такой себе плюс чтобы переписывать кучу всего. Хотелось бы узнать есть ли стоящие того преимущества
А какие еще могут быть преимущества? У вас просто указатель на функцию, тут никакой магии быть не может Ну и качество кода это немалый плюс имхо)
Универсальный тип, из которого можно получить тип возвращаемого значения, количество аргументов и т.д.
Ну да, первое это std::function<...>::result_type, остальное в общем-то можно в пару строк сделать простым трейтом, если очень хочется. Само собой и для указателя тоже
Обсуждают сегодня