E 'passato molto tempo da quando ho usato C++, e ancora di più da quando ho messo la testa sui tipi più duri. Sto semplicemente cercando uno funzionante a un liner per ottenere un argomento dalla v8, o un valore predefinito quando non è stato fornito un argomento.Il modo più breve (one-liner) per ottenere un argomento predefinito da una funzione v8?
v8::String::Utf8Value arg0(args[0]);
v8::String::Utf8Value arg1(args[1]);
v8::String::Utf8Value arg2(args[2]);
const char *username = (args.Length() > 0) ? *arg0 : "";
const char *password = (args.Length() > 1) ? *arg1 : "";
const char *service = (args.Length() > 2) ? *arg2 : "login";
Uscite:
func(); // { username: "", password: "", service: "login" } func('1'); // { username: "1", password: "", service: "login" } func('1', '2'); // { username: "1", password: "2", service: "login" } func('a', 'b', 'c'); // { username: "a", password: "b", service: "c" }
Purtroppo, i seguenti close-to-ideale soluzione non funziona per me (tutte le idee perché?):
const char *username = (args.Length() > 0) ? *v8::String::Utf8Value(args[0]->ToString()) : "";
const char *password = (args.Length() > 1) ? *v8::String::Utf8Value(args[1]->ToString()) : "";
const char *service = (args.Length() > 2) ? *v8::String::Utf8Value(args[2]->ToString()) : "login";
Ammetto che non so molto di v8, ma la tua sostituzione sembra molto sospettosa da un POV di C++: quando si eseguono i distruttori di arg0/arg1/arg2? Quando quei distruttori corrono nella tua unica nave? Cosa succede alla memoria allocata quando viene eseguito il distruttore della classe? – hvd
Hah, oh Dio ...così afaik (a parte il fatto che tutto nella v8 è statico e orribile per la gestione della memoria perché è un motore JS che ha bisogno di accedere a tutto ovunque): args * potrebbe * essere distrutto una volta che la mia funzione ritorna ... ma .. è molto possibile che v8 si blocca sui dati per il suo "tracciamento dello stack" interno. Fondamentalmente, non lo so in modo positivo, definirò sicuramente il codice una volta finito. ;) –
I singoli riquadrati non sono esattamente le soluzioni "più pulite". –