0

私はこのテンプレートを持っています:

template <class T>
v8::Handle<v8::Value> jsFunctionTemplate(const v8::Arguments &args)
{
    T *t = static_cast<T*>(args.This()->GetPointerFromInternalField(0));
    if (t != NULL) t->volume(args[0]->NumberValue());
    return args.This();
}

100%動的にしたいのでt->volume、ポインター(std :: mem_fn?)に置き換えたいと思っています。問題は、同様の例/質問から、jsFunctionTemplateの現在のタイプを保持する方法を理解できないことです(これは)である必要がありv8::InvocationCallbackます

typedef Handle<Value> (*InvocationCallback)(const Arguments& args);

そのため、使用法は次のようになります。

audio->PrototypeTemplate()->Set("Volume", v8::FunctionTemplate::New(&jsFunctionTemplate<Audio>));

私はC++11構文でさえ使用することに反対していません。

4

1 に答える 1

3

ここでv8APIが課す制限を完全に理解しているとは言いませんが、型のテンプレート引数で問題がない場合は、ここで達成したいことに対してメンバーへのポインターテンプレート引数を使用できることを願っています。 。次の自己完結型のテスト済みの例は、v8がない場合でも、これを行う方法を示しているはずです。

#include <iostream>

struct foo {
  void bar(int arg) {
    std::cout << "bar(" << arg << ") called" << std::endl;
  }
};

template<class T, void (T::*fun)(int)>
void ptfWrapup(void* ptr, int arg) {
  (static_cast<T*>(ptr)->*fun)(arg);
}

int main() {
  foo f;
  ptfWrapup<foo, &foo::bar>(&f, 42);
}

あなたの状況に適用され、NumberTypeその呼び出しの戻り値NumberValue、またはより重要なことに、呼び出したい関数の最初の引数の型であると仮定すると、次のようになります。

template <class T, void (T::*fun)(NumberType)>
v8::Handle<v8::Value> jsFunctionTemplate(const v8::Arguments &args)
{
    T *t = static_cast<T*>(args.This()->GetPointerFromInternalField(0));
    if (t != NULL) (t->*fun)(args[0]->NumberValue());
    return args.This();
}

… v8::FunctionTemplate::New(&jsFunctionTemplate<Audio, &Audio::volume>) …

上記の例とは対照的に、これはテストされていませんが、一方でコードに近いです。一緒に彼らはアイデアを明確にする必要があります、私は願っています。

于 2012-07-21T23:15:43.400 に答える