Đã lâu rồi kể từ khi tôi sử dụng C++, và thậm chí còn lâu hơn kể từ khi tôi quấn quanh đầu các loại cứng. Tôi chỉ đơn giản là tìm kiếm một làm việc một lớp lót để thực hiện một đối số từ v8 hoặc một giá trị mặc định khi đối số không được cung cấp.Cách ngắn nhất (một lớp lót) để lấy đối số mặc định từ một hàm 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";
Đầu ra:
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" }
Thật không may, sau đây close-to-lý tưởng giải pháp không làm việc cho tôi (bất kỳ ý tưởng tại sao?):
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";
Tôi thừa nhận rằng tôi không biết nhiều về v8, nhưng thay thế của bạn trông mạnh mẽ đáng ngờ từ POV C++ đối với tôi: khi nào các trình phá hủy arg0/arg1/arg2 chạy? Khi nào những kẻ phá hủy đó chạy trong một lớp lót của bạn? Điều gì sẽ xảy ra với bộ nhớ được cấp phát khi destructor của lớp được chạy? – hvd
Hah, ôi Chúa ơi ...afaik (ngoài thực tế là mọi thứ trong v8 là tĩnh và khủng khiếp đối với việc quản lý bộ nhớ vì nó là một công cụ JS cần truy cập mọi thứ ở khắp mọi nơi): args * có thể * bị hủy khi chức năng của tôi trả về ... nhưng .. rất có thể rằng v8 treo trên các dữ liệu cho nội bộ của nó "ngăn xếp truy tìm". Về cơ bản, tôi không biết tích cực, tôi chắc chắn sẽ lược tả mã khi nó kết thúc. ;) –
Một lớp lót không phức tạp không chính xác là giải pháp "sạch" nhất. –