2013-12-16 4 views
0

У меня есть функция void f (void*, int);, которая используется как функция обратного вызова. Вызывающий абонент ожидает void (*)(int). Могу ли я использовать std::bind1st для преобразования одного в другое? Есть ли способ сделать это, не используя C++ 11 std::bind, только std::bind1st?Может ли std :: bind1st использоваться для преобразования void (*) (void *, int) в void (*) (int)?

ответ

2

No. Хотя std::bind1st() создает функциональный объект вызова оператора взятия и int, это неvoid(*)(int). Единственный способ превратить void(*)(void*, int) в void(*)(int) должен иметь функцию переадресации, которая получает void* от глобальных ресурсов, например,

static void* data = 0; // probably needs to be set to a more suitable value 
void f_forward(int value) { 
    f(data, value); 
} 

Любой обеспечивает обратный вызов, который не принимает определенный пользователем контекст, например, в C-подобном интерфейсе void*, который только что прошел, не думал слишком сильно об интерфейсе.

+0

Действительно. Я надеялся избежать глобальной/статической переменной. Спасибо за ответ. –

+0

@ violetgiraffe Другой способ - написать самомодифицирующийся код, который не является переносимым и более низким, чем C++. В основном получить доступную для записи страницу из ОС, запустить известную функцию с константой, встроенной в машинный код, изменить эту константу, пометить страницу как прочитанную и исполняемую, затем взять указатель на функцию с «жестко закодированным» аннулируются * '. И да, это можно сделать на многих платформах, это редко бывает разумным. Используйте глобальный, и если вам нужно больше одного, используйте набор 'N' и глобальный массив и утвердите, что вы используете не более, чем' N'. – Yakk

Смежные вопросы