私はいくつかの非常によく似た機能を持っています:
v8::Handle<v8::Value> jsAudioPlay(const v8::Arguments &args) {
Audio *audio = static_cast<Audio*>(args.This()->GetPointerFromInternalField(0));
if (audio != NULL) audio->play(get(args[0], 0));
return args.This();
}
v8::Handle<v8::Value> jsAudioPause(const v8::Arguments &args) {
Audio *audio = static_cast<Audio*>(args.This()->GetPointerFromInternalField(0));
if (audio != NULL) audio->pause();
return args.This();
}
v8::Handle<v8::Value> jsAudioLoop(const v8::Arguments &args) {
Audio *audio = static_cast<Audio*>(args.This()->GetPointerFromInternalField(0));
if (audio != NULL) audio->loop(get(args[0], -1));
return args.This();
}
v8::Handle<v8::Value> jsAudioVolume(const v8::Arguments &args) {
Audio *audio = static_cast<Audio*>(args.This()->GetPointerFromInternalField(0));
if (audio != NULL) audio->volume(get(args[0], 1.0f));
return args.This();
}
そして、私は何時間も C++ テンプレートについて読んできましたが、これらの関数を削除してテンプレートに置き換えることが可能であると確信しています。最終結果は次のようになると思います。
typedef Handle<Value> (*InvocationCallback)(const Arguments& args);
template <class T> InvocationCallback FunctionWrapper ...;
template <class T> FunctionWrapper FunctionReal ...;
template <class T, class arg1> FunctionWrapper FunctionReal ...;
template <class T, class arg1, class arg2> FunctionWrapper FunctionReal ...;
同様の質問が寄せられていることは承知していますが、上記のようなテンプレート内にテンプレートの例が見つかりません。
2012 年 7 月 21 日の更新
テンプレート:
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();
}
使用法:
audio->PrototypeTemplate()->Set("Volume", v8::FunctionTemplate::New(&jsFunctionTemplate<Audio>));
&Audio::volume
テンプレートに渡す方法さえ理解できれば、ビジネスになります。
2012 年 7 月 24 日の更新
これをどのように解決したかについては、私の回答を参照してください。