14

パラメータの 1 つが型であるコールバック関数を持つライブラリを使用します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

文字配列がある場合は、暗黙的に 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 に答える