2013-05-17 6 views
11

Mam funkcji, która jest wielobranżowe podjąć w ciągu znaków, a następnie przekazać je do mojego C++ funkcja add_node()Jak przekonwertować std :: string do v8 Local <string>

Handle<Value> Graph::add_node(const v8::Arguments& args) 
{ 
    HandleScope scope; 

    Graph* graph = ObjectWrap::Unwrap<Graph>(args.This()); 
    graph->add_node(args[0]->ToString()); 

    std::cout << "In add node \n"; 
} 

Jednak mam problem, ponieważ wszystkie z moich argumentów są w jakimś templetes v8 i nie mogę dowiedzieć się, jak przełączać się między nimi. Model documentation również wyraźnie tego nie określa.

Kompilator daje mi ten błąd

../graph/binding.cc:52:10: error: no matching member function for call to 
     'add_node' 
    graph->add_node(args[0]->ToString()); 
    ~~~~~~~^~~~~~~~ 
../graph/directed_graph.h:27:7: note: candidate function not viable: no known 
     conversion from 'Local<v8::String>' to 'std::string &' (aka 
     'basic_string<char> &') for 1st argument; 
     void add_node(std::string & currency); 

Jak mogę przełączać Local<v8::String> i std::string &?

Odpowiedz

28

To wydaje się działać dobrze

v8::String::Utf8Value param1(args[0]->ToString()); 
std::string from = std::string(*param1); 

i jeśli tylko próbuje konwertować std::string Do v8::String następnie zrobić

std::string something("hello world"); 
Handle<Value> something_else = String::New(something.c_str()); 
+4

Późniejsze wersje v8 wymagają nieco innego podejścia: '' 'String :: NewFromUtf8 (isolate, something.c_str())' '' – Richard

1

nie mam tych ram v8 na tym polu, ale to

v8::AsciiValue av(args[0]->ToString()); 
std::basic_string<char> str(av); 
graph->add_node(str); 

powinny działać, ponieważ graph-> kopie add_node STR.

+0

'AsciiValue' nie jest w' nazw v8' już, ale w 'v8 :: String :: AsciiValue'. –