首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >V8 Javascript引擎:V8::参数和函数模板

V8 Javascript引擎:V8::参数和函数模板
EN

Stack Overflow用户
提问于 2014-07-19 12:53:09
回答 1查看 1.7K关注 0票数 1

我包装了一个C++标准库std::map<T1,T2>,我想将它作为Node.JS插件公开。我希望有两个函数,Set用于向哈希表添加一个新值,Get用于从映射中查找值。我想要一个用于“任意”类型的函数。这意味着Get必须从Args[0]中提取T1类型的值(注意Argsv8::Arguments类型的)。请看下面的代码。

代码语言:javascript
复制
template<typename T1, typename T2>
class Hash : public node::ObjectWrap {
public:
    static v8::Persistent<v8::FunctionTemplate> constructor;
    static void Init(v8::Handle<v8::Object> target);
protected:
    /* ... */
    static v8::Handle<v8::Value> New(const v8::Arguments& Args); // new object 
    static v8::Handle<v8::Value> Set(const v8::Arguments& Args); // set H[x]=y
    static v8::Handle<v8::Value> Get(const v8::Arguments& Args); // return H[x]
private:
    std::map<T1, T2> H;
};
/* ... */
template<typename T1, typename T2>
v8::Handle<v8::Value> Hash<T1, T2>::Get(const v8::Arguments& Args) {
    v8::HandleScope HandleScope;

    THash<T1, T2>* H = ObjectWrap::Unwrap<Hash<T1, T2> >(Args.This());
    // TODO: I want to extract argument Args[0] of type T1, call it x, and then
    // return argument y=H->get(x) of type T2.
    return v8::Undefined();
}

有办法这样做吗?如果是的话,怎么做呢?

如果没有提取任意类型的方法,那么如果我愿意限制几个预定义类型,最佳实践是什么?例如,T=intT=std::stringT=MyType1T=MyType2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-23 10:11:03

您需要从T1T2转换为v8::Value的助手函数,反之亦然。问题是,这种转换是特定于类型的,因此不会像建议的here那样绕过类型特征或重载函数。像这样的事情应该有效:

代码语言:javascript
复制
#include <type_traits> // C++0x

template<typename T>
T fromV8Value(v8::Handle<v8::Value> value)
{
  if (std::is_same<T,std::string>::value)
  {
    v8::String::Utf8Value stringValue(value);
    return std::string(*stringValue, stringValue.length());
  }
  else if (std::is_same<T,int>::value)
    return value->IntegerValue();
  else
    throw new std::exception("Unsupported type");
}

v8::Handle<v8::Value> toV8Value(std::string& value)
{
  return v8::String::New(value.c_str(), value.length());
}

v8::Handle<v8::Value> toV8Object(int value)
{
  return v8::Number::New(value);
}

...

v8::Handle<v8::Value> Hash::Set(const v8::Arguments& Args)
{
  T1 key = fromV8Value<T1>(Args[0]);
  T2 value = fromV8Value<T2>(Args[1]);
  return ...;
}

v8::Handle<v8::Value> Hash::Get(const v8::Arguments& Args)
{
  T1 key = fromV8Value<T1>(Args[0]);
  T2 value = ...;
  return toV8Object(value);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24840610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档