Я планировал использовать набороподобный контейнер (например, QSet
в qt или std::set
) для хранения std::function
объектов, обертывающих лямбду (с захватом или без захвата), чтобы избежать многократного добавления одной и той же лямбды. И все эти классы требуют, чтобы пользователи предоставляли функции сравнения или вычисления хэшей для типа ключа.
Однако, насколько я знаю, если базовая лямбда захватывает, метод target()
возвращает nullptr
, и поэтому два std::function
нельзя сравнивать на основе возвращаемых значений.
Итак, как я могу сравнить два произвольных std::function
или хотя бы вычислить уникальное значение из std::function
?
Использовать std::function<R(Args...)>::target_type
?
@ Jarod42 Спасибо, std::type_index
— это именно то, что я хочу. Очень приятно каждый день изучать новый C++.
Каждая лямбда имеет свой уникальный тип, поэтому вы можете использовать target_type для своих целей. Только незахватывающие лямбда-выражения могут быть преобразованы в функциональные указатели. Обратите внимание, что не так просто сравнить, равны ли две функции, в зависимости от того, что такое equal в вашем контексте. Если в вашем коде есть несколько частей, в которых вы определяете «одну и ту же» лямбду, она все равно может иметь другой тип.
auto l1 = [](){};
auto l2 = [](){};
l1 и l2 имеют разные типы и будут создавать разные записи в вашем наборе.
std::set<std::pair<std::type_index, std::function<..>>, CompareFirst>
?