В C ++ Boost.Any позволит вам сделать это безопасным для типов способом:
void func(boost::any const &x)
{
// any_cast a reference and it
// will throw if x is not an int.
int i = any_cast<int>(x);
// any_cast a pointer and it will
// return a null pointer if x is not an int.
int const *p = any_cast<int>(&x);
}
// pass in whatever you want.
func(123);
func("123");
В C вы будете использовать указатель void:
void func(void const *x)
{
// it's up to you to ensure x points to an int. if
// it's not, it might crash or it might silently appear
// to work. nothing is checked for you!
int i = *(int const*)x;
}
// pass in whatever you want.
int i = 123;
func(&i);
func("123");
Кажется, вы против этого, но я все равно рекомендую: если вы используете C ++, примите это.Не бойтесь шаблонов.Такие вещи, как Boost.Any и void указатели имеют место в C ++, но они очень малы.
Обновление :
Ну, я делаю небольшойсигналы - слоты - библиотека подключений для использования с моим набором инструментов GUI.Так что я могу избавиться от Гадкого WNDPROC.Мне нужны эти указатели для соединений.
Если вам нужны многоцелевые сигналы, Boost.Signals уже обеспечивает полную и проверенную реализацию сигналов / слотов.Вы можете использовать Boost.Bind (или std::bind
, если у вас есть компилятор C ++ 0x) для подключения функций-членов:
struct button
{
boost::signal<void(button&)> on_click;
}
struct my_window
{
button b;
my_window()
{
b.on_click.connect(std::bind(&my_window::handle_click,
this, std::placeholders::_1));
}
void handle_click(button &b)
{
}
void simulate_click()
{
b.on_click(b);
}
};
Если вы хотите только простойобратный вызов, Boost.Function (или std::function
, если у вас есть компилятор C ++ 0x) будет хорошо работать:
struct button
{
std::function<void(button&)> on_click;
}
struct my_window
{
button b;
my_window()
{
b.on_click = std::bind(&my_window::handle_click,
this, std::placeholders::_1);
}
void handle_click(button &b)
{
}
void simulate_click()
{
b.on_click(b);
}
};