Основываясь на информации из переполнения стека по следующей ссылке, это возможно, но только если вы оберните объект std :: function в его собственный класс.
std :: vector из std :: function
Используя класс-оболочку, вы можете проверить, равны ли два указателя обернутых std :: function, но это не так.ничего не скажу о том, что оборачивает функция std ::.Таким образом, изменение вашего дизайна, вероятно, является лучшим подходом.
edit: я вернулся, чтобы показать, как я решил очень похожую проблему.
0) Typedefs для краткости.
using std::placeholders;
typedef std::function < void ( int, float ) > some_func;
typedef std::pair < intptr_t, intptr_t > method_hash;
Напишите свою коллекцию объектов std :: function, привязав указатели к методам или функциям.Там, где вы делаете это для статических функций, опустите some_object_ptr.
some_func some_method ( std::bind ( some_method_ptr,
some_object_ptr, _1, _2 )
Используйте std :: reinterpret_cast , чтобы создать уникальный хеш для вашей функции, и используйте его с std:: pair для методов.
method_hash pairID ( reinterpret_cast < intptr_t > ( some_object_ptr ),
reinterpret_cast < intptr_t > ( some_method_ptr ) );
Теперь ваш pairID может храниться в векторе или другом контейнере / массиве.Просто убедитесь, что индексы выровнены так, что хеш всегда соответствует правильному объекту std :: function, и затем вы можете использовать find (), чтобы получить итератор в его позицию, и distance (), чтобы преобразовать итератор втребуемый индекс.
Обратите внимание, что это нужно будет делать каждый раз при создании контейнера.Поскольку он основан на указателях, хэши будут меняться при разных запусках вашей программы.