Использование набора функций c ++ - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать набор указателей на функции в c ++, но получаю сообщение об ошибке при вставке / удалении элементов из него.

#include<bits/stdc++.h>
using namespace std;

void func(int x) {
  cout<<x;
}

int main() {
  set <function<void (int)>> mine;
  mine.insert(func);
  return 0;
}

Я получаю сообщение об ошибке /usr/include/c++/6/bits/stl_function.h:386:20: ошибка: нет соответствия для оператора <(типы операндов: const std ::function 'and' const std :: function ').Я думаю, что эта проблема из-за оператора, который будет использоваться для сравнения заданных значений, кто-то может подсказать, как заставить это работать?Как я могу написать компаратор для указателей на функции в этом случае? </p>

1 Ответ

0 голосов
/ 08 октября 2018

Если вы хотите хранить только функциональные указатели, вам не нужно std::function:

using MyFunctionPointer = void(*)(int);

void func(int x);

std::set<MyFunctionPointer> orderedSet;

int main()
{
    orderedSet.emplace(func);
}

Демо

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

Редактировать: Как указано @ HolyBlackCat ,в то время как встроенная функция operator< не обязана вызывать требуемый общий порядок для указателей функций, std::less (как используется std::set) требуется для этого для любого указателя.

...