Я изучаю, как реализовать простые делегаты с помощью С ++ 11. Проблема в методе отключения, я хотел бы указать конкретную функцию конкретного объекта, который нужно удалить с карты. В этой реализации я стираю все функции, связанные с конкретным экземпляром объекта. Я хотел бы иметь возможность делать что-то вроде:
delegate.disconnect (myobj, &MyObj::method)
вместо
delegate.disconnect (myobj)
который стирает все подключенные функции для myobj.
template <typename ... Params >
class Delegate {
private:
typedef std::function < void (Params...)> FunctionType;
std::map < void*, std::vector < FunctionType >> m_functions;
public:
template <typename Class>
void connect(Class& obj, void (Class::*func) (Params...) )
{
std::function < void (Class, Params...) > f = func;
FunctionType fun = [&obj, f](Params... params) { f(obj, params...); };
m_functions[&obj].push_back(fun);
}
template <typename Class>
void disconnect(Class& obj) {
m_functions.erase(&obj);
}
template <typename ... Args>
void operator() (Args...args)
{
for (auto& pair : m_functions) {
for (auto& func : pair.second) {
func(args...);
}
}
}
};