Но мне не нравится, как я не могу проверить NULL или сделать что-то еще
Как насчет того, чтобы сделать обратный вызов (OnPaintCallback
) объектом класса, который перегружает operator =
таким образом, вы можете выполнить любую дополнительную проверку и выдать исключение, если что-то пойдет не так.Вы также можете перегрузить operator ()
, чтобы вызвать этот объект, как если бы он был простым указателем на функцию.
Обновление: Что касается переменного числа аргументов функции, то здесь нет общего способа.чтобы сделать это, но если ваш максимальный N ограничен и невелик, вы можете использовать шаблонные специализации, например: (я упустил конструкторы, operator =
и другие подробности для ясности)
template<typename T, int N>
class Callback {
};
template<typename T>
class Callback<T, 1> {
T func;
template<typename A1>
void operator ()(A1 arg1) {
func(arg1);
}
};
template<typename T>
class Callback<T, 2> {
T func;
template<typename A1, typename A2>
void operator ()(A1 arg1, A2 arg2) {
func(arg1, arg2);
}
};
Я знаюэто хакерский способ сделать это, но по крайней мере ваши пользователи не увидят ничего из этого: они получат одинаковый интерфейс для всех обратных вызовов.