В настоящее время я пробую код, который делает следующее:
void f(int x) { cout << "f("<<x<<")" << endl; }
class C
{
public:
void m(int x) { cout << "C::m("<<x<<")" << endl; }
};
class C2
{
public:
void registerCallback(function<void(int)> f)
{
v.push_back(f);
}
private:
vector<function<void(int)>> v;
void callThem()
{
for (int i=0; i<v.size(); i++)
{
v[i](i);
}
}
};
int main()
{
C2 registrar;
C c;
registrar.registerCallback(&f); // Static function
registrar.registerCallback(bind(&C::m, &c, placeholders::_1)); // Method
return 0;
}
Это работает очень хорошо. Однако я застрял с этим шаблоном. Я хотел бы проверить, был ли уже зарегистрирован обратный вызов, и я хотел бы иметь возможность отменить регистрацию обратного вызова, удалив его из вектора. Я только что узнал, что std::function
объекты нельзя сравнивать, а значит, невозможно искать их существование в контейнере.
Поэтому мне нужна альтернатива. Конечно, хотелось бы сохранить проверки типов во время компиляции и возможность регистрировать методы произвольных классов.
Как я могу добиться аналогичного решения, позволяющего отменить регистрацию обратного вызова и проверить двойную регистрацию? Есть ли компромиссы, на которые я должен пойти?