У меня есть список объектов boost :: function, и я пытаюсь найти конкретный, поэтому я могу удалить его из списка. Фактически функция зарегистрирована (нажата на вектор), и я хочу иметь возможность ее отменить (поиск вектора и удаление указателя соответствующей функции). Вот код:Сравнение указателей функций, хранящихся как boost :: function
#include <string>
#include <vector>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/shared_ptr.hpp>
class DummyClass
{
public:
std::string Data;
};
typedef boost::shared_ptr<DummyClass> DummyClassPtrType;
class UpdaterClass
{
public:
void handle(DummyClassPtrType Dummy);
};
class ManagerClass
{
public:
typedef boost::function<void (DummyClassPtrType Dummy)> HandlerFunctionType;
typedef std::vector<HandlerFunctionType> HandlerFunctionListType;
//
HandlerFunctionListType HandlerFunctionList;
void registerHandler(HandlerFunctionType Handler)
{
HandlerFunctionList.push_back(Handler);
}
void unRegister(HandlerFunctionType Handler)
{
// find the function pointer in the list and delete it from the list if found
HandlerFunctionListType::iterator HandlerIter = HandlerFunctionList.begin();
while (HandlerIter != HandlerFunctionList.end())
{
if (*HandlerIter == Handler) // error C2666: 'boost::operator ==' : 4 overloads have similar conversions
{
HandlerIter = HandlerFunctionList.erase(HandlerIter);
break;
}
else
{
++HandlerIter;
}
}
}
};
int main()
{
ManagerClass Manager;
UpdaterClass Updater;
Manager.registerHandler(boost::bind(&UpdaterClass::handle, &Updater, _1));
Manager.unRegister(boost::bind(&UpdaterClass::handle, &Updater, _1));
return 0;
}
Компилятор (VS2008 SP1) не нравится строка:
if (*HandlerIter == Handler)
, и я не могу понять, как достичь этого.
Почему я не могу сравнивать объекты boost :: function с оператором == или оператором! =? http://www.boost.org/doc/libs/1_50_0/doc/html/function/faq.html#id1565973 – PiotrNycz
См. соответствующую тему http://stackoverflow.com/questions/3629835/why-is-stdfunction- неравномерное сравнение –
Вы можете использовать сигналы: http://www.boost.org/doc/libs/1_50_0/doc/html/signals/tutorial.html#id3161780 – PiotrNycz