14

我使用具有回调函数的库,其中一个参数是 type void *。(我想让发送任何类型的值。)

我需要传递一个字符串(std::string或 achar[]相同)。

我怎样才能做到这一点?

4

3 回答 3

11

如果您确定对象在函数的生命周期内是活动的(并且可以修改),则可以对字符串指针进行强制转换,将其转回回调中的引用:

#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!

于 2013-01-28T00:12:52.637 回答
7

如果你有一个 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函数调用表达式的寿命更长。

于 2013-01-27T23:59:50.267 回答
4

如果它是您提供的回调函数,那么您可以简单地传递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 所说,确保字符串对象的生命周期至少与使用回调的时间跨度一样长。

于 2013-01-28T00:08:17.147 回答