c++ - 从 v8 函数中获取默认参数的最短方法(单行)?

标签 c++ node.js v8 node.js-addon

我已经有很长一段时间没有使用 C++ 了,甚至更久没有开始研究硬类型了。我只是在寻找一个工作 one liner 来从 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";

输出:

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" }

Unfortunately, the following close-to-ideal solution doesn't work for me (any ideas why?):

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";

最佳答案

Vyacheslav Egorov 用他的评论指出了这一点,当我访问该字符串时,它已被销毁。最终我最终使用了:

char *get(v8::Local<v8::Value> value, const char *fallback = "") {
    if (value->IsString()) {
        v8::String::AsciiValue string(value);
        char *str = (char *) malloc(string.length() + 1);
        strcpy(str, *string);
        return str;
    }
    char *str = (char *) malloc(strlen(fallback) + 1);
    strcpy(str, fallback);
    return str;
}

使用示例:

v8::Handle<v8::Value> myMethod(const v8::Arguments &args) {
    char *username = get(args[0], "user");
    char *password = get(args[1], "pass");

    ...
}

关于c++ - 从 v8 函数中获取默认参数的最短方法(单行)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507323/

相关文章:

javascript - 错误 : ‘NewSymbol’ is not a member of ‘v8::String’ ?

c++ - 最近点算法 |如何改进?

javascript - 在 Node 中递归地请求模块

node.js - 在 NodeJS 中使用 mp4 容器流式传输转换后的电影,电影播放速度非常快

node.js - Configuration.resolve 有一个未知属性 'root'

c++ - Node Addons 和 v8 GlobalTemplate

C++ 编写内联函数作为参数传递

c# - 从 STL 容器中弹出时,为什么 c# 可以返回对象而 c++ 不能?

c++ - 将 char 数组复制到字节数组中,而不仅仅是传递指针

javascript - 为什么是 ecmascript 而不是 javascript?为什么 ecma 网站看起来像是 1999 年左右的?