Как я могу однозначно идентифицировать лямбду (может быть захваченную), содержащуюся в std::function в С++

Я планировал использовать набороподобный контейнер (например, QSet в qt или std::set) для хранения std::function объектов, обертывающих лямбду (с захватом или без захвата), чтобы избежать многократного добавления одной и той же лямбды. И все эти классы требуют, чтобы пользователи предоставляли функции сравнения или вычисления хэшей для типа ключа.

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

Итак, как я могу сравнить два произвольных std::function или хотя бы вычислить уникальное значение из std::function?

std::set<std::pair<std::type_index, std::function<..>>, CompareFirst>?
Jarod42 10.12.2020 15:53

Использовать std::function<R(Args...)>::target_type?

NathanOliver 10.12.2020 15:53

@ Jarod42 Спасибо, std::type_index — это именно то, что я хочу. Очень приятно каждый день изучать новый C++.

Eddie Deng 11.12.2020 16:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждая лямбда имеет свой уникальный тип, поэтому вы можете использовать target_type для своих целей. Только незахватывающие лямбда-выражения могут быть преобразованы в функциональные указатели. Обратите внимание, что не так просто сравнить, равны ли две функции, в зависимости от того, что такое equal в вашем контексте. Если в вашем коде есть несколько частей, в которых вы определяете «одну и ту же» лямбду, она все равно может иметь другой тип.

auto l1 = [](){};
auto l2 = [](){};

l1 и l2 имеют разные типы и будут создавать разные записи в вашем наборе.

Другие вопросы по теме