EDIT:
Я изменил пример API, чтобы он лучше отражал реальный API, с которым я имею дело. API получает аргумент message
, передаваемый ему, путем ввода данных пользователем, поэтому аргумент message
нельзя использовать для передачи дополнительных данных.
Я имею дело с очень разочаровывающим API, который использует подпрограммы обратного вызова, которые не используют указатели "void * userarg".
Предполагая, что функция, которая использует процедуру обратного вызова, как определено API, ожидает строковый аргумент (который будет назначен пользовательским вводом), есть ли ЛЮБОЙ возможный способ получить больше данных в моей процедуре обратного вызова без использования глобальных переменных?
Вот упрощенный пример того, как может выглядеть API:
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////////////////////
// ASSUME EVERYTHING IN THIS SECTION IS PART OF AN API AND IS NOT MY OWN CODE...
// I DO NOT HAVE THE SOURCE AND IT CANNOT BE MODIFIED
typedef void (*CALLBACK)(string message);
void call_callback(CALLBACK cb) {
// Gets a message from user input
string message = "hello"; // pretend this is user input
cb(message);
}
////////////////////////////////////////////////////////////////////////////////
int data = 42;
void callback_function(string message) {
// I want to access "data" here WITHOUT it being global
cout << message << ' ' << data << endl;
}
int main(int argc, char** argv) {
call_callback(&callback_function);
}
Обычно API, использующий обратные вызовы, также передает аргумент «void * userarg» в процедуру обратного вызова, чтобы вы могли передавать дополнительные данные любого типа, но здесь это не так.
Этот API широко используется во всей нашей кодовой базе, и на 100% необходимо передавать намного больше данных в каждом случае, когда он используется. Текущий способ получения большего количества данных в * подготовка к сжатию * заключается в хранении практически всех наших данных в единичных блоках, так что почти все является глобальным и к нему можно получить доступ буквально из любой точки программы .
Вся эта концепция кажется мне ЗЛО , но без лучшего API я не могу найти лучшего способа получить данные для обратного вызова. Я уже связался с поставщиком и попросил, чтобы он исправил свой API, чтобы он принимал аргумент "void * userarg", но не похоже, что он будет исправлен в ближайшее время ...
Все, на что я надеюсь, это ЛЮБОЙ лучший способ делать вещи, чем мы сейчас.