Ответ dribeas является верным в том, что касается современного C ++.
Ради интереса, существует также простое технологичное решение из мира C, которое, насколько это возможно, работает в C ++.,Вместо того, чтобы разрешать произвольные параметры, определите функцию как void (*func)(void*)
и сделайте «params» void*
.Тогда задача вызывающего - определить некоторую структуру, которая будет содержать параметры, и управлять ее жизненным циклом.Обычно вызывающая сторона также записывает простую оболочку для функции, которую действительно необходимо вызвать:
void myfunc(int, float); // defined elsewhere
typedef struct {
int foo;
float bar;
} myfunc_params;
void myfunc_wrapper(void *p) {
myfunc_params *params = (myfunc_params *)p;
myfunc(params->foo, params->bar);
}
int main() {
myfunc_params x = {1, 2};
AddTimer(23, 5, myfunc_wrapper, &x);
sleep(23*5 + 1);
}
На практике вы хотите «запустить и забыть» таймеры, поэтому если вы используете эту схему, вам также может понадобитьсяспособ таймера освободить указатель пользовательских данных после завершения всех срабатываний.
Очевидно, что это ограничивает безопасность типов.В принципе, это не должно иметь значения, потому что тот, кто предоставляет указатель на функцию и указатель на данные пользователя, не должен испытывать особых трудностей при обеспечении их соответствия.Конечно, на практике люди находят способы писать ошибки и обвинять вас, потому что их компилятор не говорил им об ошибках; -)