Я использую библиотеку, которая имеет функцию обратного вызова, где один из параметров имеет тип void *
, (Я полагаю, чтобы позволить отправить значение любого типа.)
Мне нужно передать строку (std::string
или char[]
та же).
Как я могу это сделать?
Если вы уверены, что объект жив (и может быть изменен) в течение времени жизни функции, вы можете выполнить приведение к строковому указателю, превратив его обратно в ссылку в обратном вызове:
#include <iostream>
#include <string>
void Callback(void *data) {
std::string &s = *(static_cast<std::string*>(data));
std::cout << s;
}
int main() {
std::string s("Hello, Callback!");
Callback( static_cast<void*>(&s) );
return 0;
}
Выход Hello, Callback!
Если у вас есть массив символов, он может быть неявно преобразован в пустой указатель. Если у вас есть строка C ++, вы можете взять адрес первого элемента:
void f(void *); // example
#include <string>
int main()
{
char a[] = "Hello";
std::string s = "World";
f(a);
f(&s[0]);
}
Убедитесь, что std::string
переживает выражение вызова функции.
Если это функция обратного вызова, которая вы поставляете, чем вы можете просто передать адрес std::string
объект
void f(void* v_str)
{
std::string* str = static_cast<std::string*>(v_str);
// Use it
}
...
...
std::string* str = new std::string("parameter");
register_callback(&f, str);
В любом случае, как сказал Kerrek SB, убедитесь, что время жизни строкового объекта не меньше, чем промежуток времени, в течение которого используется обратный вызов.