V8 Javascript engine: v8 :: Аргументы и шаблоны функций

Я обернул стандартную библиотеку C ++ std::map<T1,T2> что я хочу выставить как дополнение Node.JS. Я хочу иметь две функции, Set для добавления нового значения в хеш-таблицу, и Get для поиска значения с карты. Я хочу одну функцию, которая будет работать для «произвольного» типа. Это означает Get придется извлечь значение типа T1 от Args[0] (Обратите внимание, что Args имеет тип v8::Arguments). Смотрите код ниже.

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=int, T=std::string, T=MyType1, а также T=MyType2,

1

Решение

Вам нужны вспомогательные функции, которые будут конвертировать из T1 а также T2 в v8::Value и наоборот. Проблема в том, что это преобразование зависит от типа, поэтому вы не сможете обойтись без признаков типа или перегруженных функций для каждого типа, как это предлагается Вот. Примерно так должно работать:

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

Другие решения


По вопросам рекламы [email protected]