В настоящее время я использую систему таймера/обратного вызова с использованием fastdelegates дона Клагстона. (См http://www.codeproject.com/KB/cpp/FastDelegate.aspx)Передача между указателями функций
Вот исходный код:
struct TimerContext
{
};
void free_func(TimerContext*)
{
}
struct Foo
{
void member_func(TimerContext*)
{
}
};
Foo f;
MulticastDelegate< void (TimerContext*) > delegate;
delegate += free_func;
delegate += bind(&Foo::member_func, &f);
Хорошо, но теперь, я хочу, чтобы пользователь смог подклассы TimerContext
хранить и передавать свои собственные структуры для обратных вызовов. Цель здесь заключается в предотвращении пользователя от необходимости в TimerContext
обратное приведение себя
struct TimerContext
{
};
struct MyTimerContext : TimerContext
{
int user_value;
};
void free_func(TimerContext*)
{
}
void free_func2(MyTimerContext*)
{
}
struct Foo
{
void member_func(TimerContext*)
{
}
void member_func2(MyTimerContext*)
{
}
};
Foo f;
MulticastDelegate< void (TimerContext*) > delegate;
delegate += free_func;
delegate += free_func2;
delegate += bind(&Foo::member_func, &f);
delegate += bind(&Foo::member_func2, &f);
Как вы уже догадались, GCC не позволит мне сделать это :)
error: invalid conversion from `void (*)(MyTimerContext*)' to `void (*)(TimerContext*)'
error: initializing argument 1 of `delegate::Delegate<R()(Param1)>::Delegate(R (*)(Param1)) [with R = void, Param1 = TimerContext*]'
Так что теперь мой вопрос: Если я заставляю актерский состав reinterpret_cast
, он будет работать, но будет ли он безопасен?
PS: Это время критически важные функции обратного вызова, тяжелые виртуальные-ориентированные решения считаются неосуществимо:/
Howw, ладно :(Спасибо за ссылку! – NewbiZ
Даже повышение :: функция не будет работать в его случае, потому что TimerContext * не неявно конвертируются в MyTimerContext *. Я упомянул этот вопрос типа безопасности в моем ответ, но я почему-то отказался от него. – sellibitze