У меня есть функция void f (void*, int);
, которая используется как функция обратного вызова. Вызывающий абонент ожидает void (*)(int)
. Могу ли я использовать std::bind1st
для преобразования одного в другое? Есть ли способ сделать это, не используя C++ 11 std::bind
, только std::bind1st
?Может ли std :: bind1st использоваться для преобразования void (*) (void *, int) в void (*) (int)?
Q
Может ли std :: bind1st использоваться для преобразования void (*) (void *, int) в void (*) (int)?
0
A
ответ
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*
, который только что прошел, не думал слишком сильно об интерфейсе.
Смежные вопросы
- 1. разница между void (int) & void (*) (int)
- 2. Имеет ли void (*) (int) 'то же самое с' void (^) (int) '?
- 3. Предупреждение (Анахронизм): Назначение void (*) (int) для extern «C» void (*) (int)
- 4. Ошибка: преобразование из 'void (FlashWork :: *) (int, siginfo_t *, void *)' to 'void * (*) (int, siginfo_t *, void *)'
- 5. В чем разница между void (int) и void (*) (int)?
- 6. Объединение int с void *
- 7. Ошибка: неверное преобразование из 'int (*) (void *)' to 'void * (*) (void *)'
- 8. sizeof (int) == sizeof (void *)?
- 9. Несовместимый указатель блока типа 'void (^)() NSUInteger * (*) (int))' to 'void (^) (int)'
- 10. Выполнение функции int void *
- 11. Извлечение int из void *
- 12. Почему (void **) тип может быть назначен (void *) или (int *)?
- 13. не может конвертировать из "void" в "int"
- 14. Java void в массив int
- 15. не может преобразовать void в int
- 16. литье из void ** в int
- 17. public void add (int a, int ... b) {
- 18. Safely cast void * to int
- 19. Преобразование void Алгоритм в int []
- 20. int main (void), давая ошибку
- 21. не может преобразовать 'void (myClass :: *)() в void (*)()
- 22. C int main() vs. int main (void)
- 23. C: Чтение int ** из void *
- 24. Void and cout vs int
- 25. В чем смысл этой части кода? void (* signal (int sig, void (* func) (int))) (int);
- 26. C/C++ casting void * to int (*()) (int, ...);
- 27. Опишите: int (* (* var [3])()) (void (*)());
- 28. Как отличить int unique_ptr в void unique_ptr?
- 29. Листинг int для void * и void * для int для TMemoryStream-> WriteBuffer (C++ Builder XE7)
- 30. undefined ссылка на '__gthrw ___ pthread_key_create (unsigned int *, void (*) (void *))
Действительно. Я надеялся избежать глобальной/статической переменной. Спасибо за ответ. –
@ violetgiraffe Другой способ - написать самомодифицирующийся код, который не является переносимым и более низким, чем C++. В основном получить доступную для записи страницу из ОС, запустить известную функцию с константой, встроенной в машинный код, изменить эту константу, пометить страницу как прочитанную и исполняемую, затем взять указатель на функцию с «жестко закодированным» аннулируются * '. И да, это можно сделать на многих платформах, это редко бывает разумным. Используйте глобальный, и если вам нужно больше одного, используйте набор 'N' и глобальный массив и утвердите, что вы используете не более, чем' N'. – Yakk