Вы можете создать свой собственный класс, который будет выполнять ту же функцию, что и функция boost bind. Все, что должен сделать класс, это принять тип функции и указатель на объект, который содержит функцию. Например, это делегат void return и void param:
template<typename owner>
class VoidDelegate : public IDelegate
{
public:
VoidDelegate(void (owner::*aFunc)(void), owner* aOwner)
{
mFunction = aFunc;
mOwner = aOwner;
}
~VoidDelegate(void)
{}
void Invoke(void)
{
if(mFunction != 0)
{
(mOwner->*mFunction)();
}
}
private:
void (owner::*mFunction)(void);
owner* mOwner;
};
Использование:
class C
{
void CallMe(void)
{
std::cout << "called";
}
};
int main(int aArgc, char** aArgv)
{
C c;
VoidDelegate<C> delegate(&C::CallMe, &c);
delegate.Invoke();
}
Теперь, поскольку VoidDelegate<C>
является типом, иметь коллекцию из них может быть непрактично, потому что, что, если список должен был бы также содержать функции класса B? Это не могло.
Это где полиморфизм вступает в игру. Вы можете создать интерфейс IDelegate, который имеет функцию Invoke:
class IDelegate
{
virtual ~IDelegate(void) { }
virtual void Invoke(void) = 0;
}
Если VoidDelegate<T>
реализует IDelegate, вы можете иметь коллекцию IDelegate и, следовательно, иметь обратные вызовы для методов в различных типах классов.