我使用具有回调函数的库,其中一个参数是 type void *
。(我想让发送任何类型的值。)
我需要传递一个字符串(std::string
或 achar[]
相同)。
我怎样才能做到这一点?
我使用具有回调函数的库,其中一个参数是 type void *
。(我想让发送任何类型的值。)
我需要传递一个字符串(std::string
或 achar[]
相同)。
我怎样才能做到这一点?
如果您确定对象在函数的生命周期内是活动的(并且可以修改),则可以对字符串指针进行强制转换,将其转回回调中的引用:
#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!
如果你有一个 char 数组,那么它可以隐式转换为 void 指针。如果你有一个 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 所说,确保字符串对象的生命周期至少与使用回调的时间跨度一样长。