を無効にするには、現在、私は次のように使用して機能を結合しています:V8 - args.Dataキャスティング()バックポインタ
global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print));
機能により:
static void js_print(const v8::FunctionCallbackInfo<v8::Value> &args);
実装:
void V8Instance::js_print(const v8::FunctionCallbackInfo<v8::Value> &args) {
for (int i = 0; i < args.Length(); i++) {
v8::HandleScope handle_scope(args.GetIsolate());
v8::String::Utf8Value str(args[i]);
std::cout << *str << std::endl;
}
std::cout << std::endl;
}
を
しかし、私はjs_print関数がV8Instanceクラスのメンバである変数にアクセスできるようにします。 V8には、メンバー関数をバインドできるboost::bind(&Class::function, this, ...)
を使用できるようなものがありますか、呼び出されるたびにリファレンス/ポインタで必要な変数をjs_print
に渡す方法がありますか?
私はFunctionTemplate::New
のデータパラメータを使用して私のクラスへのポインタを渡すことができることを見出したアップデート
:私はargs.Data()
を使用して、私のjs_print
機能でこれにアクセスすることができます
Local<External> self = External::New(isolate, (void *) this);
global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print, self));
が、これはLocal<Value>
を返します。どのオブジェクトをvoid *
にキャストしてから、私のクラスポインタV8Instance *
にキャストするのか分かりません。誰もこれを行う方法を知っていますか?
私はV8のGoogleのグループに尋ねたと明らかに私はちょうど 'FunctionTemplate'のデータとして私のクラスへのポインタを渡すことができ、私が使用してこれを行う方法を考え出した(第3引数)。 ' ' Local self = External :: new(分離、(void *)this); ' そして' self'を3番目の引数として渡しますが、 'args.Data ( 'js_print'の中で)' V8Instance * 'に戻る –
Jack
私の答えに更新が追加されました。 – pmed
ありがとう、ええ、それは私が探していたものです。正しいとマークされました – Jack