我使用具有回调函数的库,其中一个参数的类型为void *
。 (我想让我们发送任何类型的价值。)
我需要传递一个字符串(std::string
或char[]
是相同的)。
我该怎么做?
答案 0 :(得分:7)
如果你确定在函数的生命周期中对象是活的(并且可以被修改),你可以对字符串指针进行强制转换,然后将它转回回调中的引用:
#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!
答案 1 :(得分:5)
如果你有一个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
比函数调用表达式更长。
答案 2 :(得分:2)
如果是您提供的回调函数,则只需传递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所说,确保字符串对象的生命周期至少与回调正在使用的时间跨度一样长。