Я бы хотел, чтобы кто-нибудь показал обратное, но, насколько я знаю, вам придется разбираться с этим поэтапно.Первый шаг - создать связанную функцию, т. Е. Взять указанную вами функцию и создать объект, который, когда вы ее вызываете, в свою очередь вызывает указанную функцию с указанными параметрами.Используя Boost / TR1 / C ++ 0x bind
, это будет выглядеть примерно так:
std::tr1::function<void (int)> func(std::tr1::bind(&TextBox::changColor, this, red));
Это делает func
объектом, который будет вызывать TextBox::changeColor(red)
при его вызове.Однако есть одна небольшая проблема: func
это объект, а не функция.Синтаксически использование этого похоже на вызов функции, но это иллюзия, созданная компилятором C ++;Попытка передать адрес этого объекта чему-то, что будет использовать его как адрес функции, потерпит неудачу (вероятно, довольно впечатляюще).К сожалению, по крайней мере в Windows нет способа назначить произвольный параметр, который будет передан функции обратного вызова таймера (хотя вы могли бы , вероятно, сделать это в параметре nIdEvent
с некоторым действительно грубым приведением, что-то вроде:
void callback(HWND, UINT, UINT_PTR f, DWORD) {
typedef std::tr1::function<void (int)> function;
function *func = reinterpret_cast<function *>(f);
(*func)();
}
Чтобы сделать это немного чище, вместо преобразования адреса в целое число без знака, я бы рассмотрел сохранение адреса обратного вызова в массиве и передачу его индекса ввместо массива:
void callback(HWND, UINT, UINT_PTR f, DWORD) {
callback_functions[f]();
}
Таким образом, действительно остается непереносимой частью: фактически заставить систему вызывать эту функцию по истечении определенного промежутка времени. Хотя большинство современных систем имеют одну, каждаявсе еще уникален. В Windows (для одного примера) вы могли бы сделать что-то вроде этого:
callback_functions[++N] = func;
SetTimer(hWnd, N, 30, callback);
Для такой простой идеи это слишком уродливый и сложный ответ, но я, честно говоря, не знаючто-нибудь намного менее сложное, что сработает. Если у вас есть почти любой разумный выбор в этом вопросе, я бы использовал что-то еще.на самом деле это набросок потока сознания - ни один код не был скомпилирован, а тем более реально протестирован.Я не вижу веской причины, по которой общая идея не должна работать, но может потребоваться немало усилий, чтобы воплотить ее в реальность (например, я в основном пренебрегал управлением массивом callback_functions).