현재 나는 다음과 같은 사용하여 기능을 결합하고 포인터를 무효화하는 주조 :V8 - args.Data() 다시
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;
}
기능으로
global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print));
을
그러나 js_print 함수가 V8Instance 클래스의 멤버 인 변수에 액세스하도록하고 싶습니다. V8은 회원 함수를 바인드하게 해주는 boost::bind(&Class::function, this, ...)
을 사용할 수있는 것과 비슷합니까? 아니면 호출 할 때마다 js_print
에 대한 참조/포인터로 필요한 변수를 전달할 수있는 방법이 있습니까?
업데이트
나는 FunctionTemplate::New
의 데이터 매개 변수를 사용하여 내 클래스에 대한 포인터를 전달할 수 있다는 것을 발견했다 :
Local<External> self = External::New(isolate, (void *) this);
global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print, self));
내가 args.Data()
를 사용하여 내 js_print
기능이 액세스 할 수 있지만이 Local<Value>
을 반환 어떤 객체를 void *
으로 다시 캐스팅 한 다음 다시 내 클래스 포인터 V8Instance *
으로 캐스팅해야하는지 모르겠습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까?
나는 V8 구글 그룹에 물어 분명히 난 그냥'FunctionTemplate'의 데이터로 내 클래스에 대한 포인터를 전달할 수 있습니다 내가 사용하여이 작업을 수행하는 방법을 알아 냈어요 (3 인수.) '로컬 자기 = 외부 :: 새로운 (분리, (무효 *)이);' 그리고 제 3 인수로'자기'를 전달하지만 어떻게'args.Data()'('js_print'에서)'V8Instance *'로 돌아 가기 –
Jack
내 대답에 업데이트가 추가되었습니다. – pmed
고마워, 네가 그걸 찾고있어. 올바른 것으로 표시했습니다. – Jack