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

我包装了一个C ++标准库std::map<T1,T2> ,我想作为一个Node.JS插件公开。 我想要有两个函数,一个是为哈希表添加一个新的值,另一个是从地图上查找值。 我想要一个适用于“任意”types的函数。 这意味着Get必须从Args[0]提取typesT1值(请注意, Argsv8::Argumentstypes的)。 请参阅下面的代码。

 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(); } 

有没有办法做到这一点? 如果是,那么做法是什么?

如果没有办法提取任意types,如果我愿意限制到几个预定义的types,最好的做法是什么? 例如, T=intT=std::stringT=MyType1T=MyType2

您需要帮助函数将从T1T2转换为v8::Value ,反之亦然。 问题是,这种转换是特定于types的,所以你不会像这里所build议的那样绕过types特征或者每种types的重载函数。 像这样的东西应该工作:

 #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); }