パラメータの 1 つが型であるコールバック関数を持つライブラリを使用しますvoid *
。(任意の型の値を送信できると思います。)
文字列を渡す必要があります (std::string
または achar[]
は同じです)。
これどうやってするの?
パラメータの 1 つが型であるコールバック関数を持つライブラリを使用します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!
文字配列がある場合は、暗黙的に 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 が言ったように、文字列オブジェクトの有効期間が少なくともコールバックが使用されている期間と同じであることを確認してください。