如何将中的函数包装器转换为模板
How do I convert a function wrapper in to templates?
我有几个非常相似的函数:
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日更新
请参阅我的答案,了解我是如何解决此问题的。
欢迎使用lambda的魔力。
template<typename F> v8::Handle<v8::Value> jsAudio(const v8::Arguments &args, F&& f) {
Audio *audio = static_cast<Audio*>(args.This()->GetPointerFromInternalField(0));
if (audio != NULL) f(audio, args);
return args.This();
}
int main() {
jsAudio(..., [&](Audio* audio, const v8::Arguments &args) {
audio->play(get(args[0], 0));
});
}
例如。
我的模板:
template <class T, class RT, RT(T::*f)()> v8::Handle<v8::Value> jsFunctionTemplate(const v8::Arguments &args) {
T *t = static_cast<T*>(args.This()->GetPointerFromInternalField(0));
if (t != NULL) (t->*f)();
return args.This();
}
template <class T, class RT, class A0, RT(T::*f)(A0)> v8::Handle<v8::Value> jsFunctionTemplate(const v8::Arguments &args) {
T *t = static_cast<T*>(args.This()->GetPointerFromInternalField(0));
if (t != NULL) (t->*f)(jsConvert<A0>(args[0]));
return args.This();
}
template <class T, class RT, class A0, class A1, RT(T::*f)(A0, A1)> v8::Handle<v8::Value> jsFunctionTemplate(const v8::Arguments &args) {
T *t = static_cast<T*>(args.This()->GetPointerFromInternalField(0));
if (t != NULL) (t->*f)(jsConvert<A0>(args[0]), jsConvert<A1>(args[1]));
return args.This();
}
用法:
audio->PrototypeTemplate()->Set("Play", v8::FunctionTemplate::New(&jsFunctionTemplate<Audio, Audio*, int, &Audio::play>));
audio->PrototypeTemplate()->Set("Pause", v8::FunctionTemplate::New(&jsFunctionTemplate<Audio, Audio*, &Audio::pause>));
audio->PrototypeTemplate()->Set("Loop", v8::FunctionTemplate::New(&jsFunctionTemplate<Audio, Audio*, int, &Audio::loop>));
audio->PrototypeTemplate()->Set("Volume", v8::FunctionTemplate::New(&jsFunctionTemplate<Audio, Audio*, float, &Audio::volume>));
现在,我需要弄清楚最后两个步骤:可变数量的参数,以及正确地模板化jsConvert
以返回所需的类型<A0>
。
相关文章:
- 将函数包装器转换为 std::function
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- std::带有指向成员函数和back_inserter的指针的转换包装器
- 将C++转换为C#:如何包装C++中的类,使模板类中的方法在C#中的派生类中可用
- 如何将std ::功能包装器转换为变异功能
- 我可以安全地转换为兄弟类来包装受保护的函数吗
- 如何将中的函数包装器转换为模板
- 将十进制数转换为包装 BCD,反之亦然
- 包装 API 时,我是否应该避免在实现类中进行向上转换
- 使用接口包装库,而无需向下转换
- 允许在包装模板中将非常数转换为常量
- 函数包装器,适用于所有类型的函数,无需强制转换
- 在结构体中包装数字以避免隐式转换的利弊
- SWIG包装c++ for Python:将字符串列表转换为STL字符串的STL向量
- Directshow转换过滤器包装
- 使用c++包装器的OpenCL -如何转换cl::CommandQueue到cl_command_queue
- 将std::string转换为QString的包装器
- 来自包装器接口的动态强制转换
- 将基类的引用包装器的矢量转换为派生类的引用包装程序的矢量不能动态强制转换
- 如何将迷你压缩包装器转换为 unicode