Dokumentacja Google v8 opisuje sposób dodania globalnej funkcji do kontekstu JavaScript. Możemy zaimplementować funkcję printf jak łatwo za pomocą nowej funkcji lambda od C++ 11:v8 :: FunctionTemplate odwołujące się do innej niż globalna zmienna
Handle<ObjectTemplate> global = ObjectTemplate::New();
global->Set(String::New("print"), FunctionTemplate::New(
[](const v8::Arguments &args) -> v8::Handle<v8::Value>
{
v8::String::AsciiValue ascii(args[0]);
std::cout << *ascii << "\n";
}));
Persistent<Context> context = Context::New(NULL, global);
Działa to dobrze dla każdej funkcji JavaScript globalnego, który jest albo bezpaństwowca lub referencje globalnym C++ zmienna (tj std::cout
) . Ale co, jeśli chcemy, aby nasza globalna funkcja JavaScript odwoływała się do nieglobalnej zmiennej C++? Załóżmy na przykład, że tworzymy kilka różnych kontekstów JavaScript, każdy z własną globalną funkcją print
, która używa innego C++ std::ostream
? Jeśli szablony funkcyjne V8 stosowany std::function
obiektów zamiast wskaźników funkcji, to czy możemy zrobić coś takiego:
Persistent<Context> create_context(std::ostream &out)
{
Handle<ObjectTemplate> global = ObjectTemplate::New();
global->Set(String::New("print"), FunctionTemplate::New(
[&out](const v8::Arguments &args) -> v8::Handle<v8::Value>
{
v8::String::AsciiValue ascii(args[0]);
out << *ascii << "\n";
}));
return Context::New(NULL, global);
}
Niestety v8 nie wydają się wspierać. Zakładam (mam nadzieję?), Że v8 ma sposób na robienie czegoś funkcjonalnie równoważnego, ale jestem doszukiwany przez Doxygen dla v8::FunctionTemplate
. Czy ktokolwiek, kto próbowałby czegoś podobnego, chciał poddać proces destylacji w coś bardziej zrozumiałego? Chciałbym również dowiedzieć się, jak utworzyć globalną instancję obiektu JavaScript, który jest powiązany z istniejącą, nieglobalną instancją obiektu C++.