C++调用JS,可变参模板实现,方便调用(cocos2d-x)
2015-07-06 00:30
633 查看
#include "scripting/js-bindings/manual/ScriptingCore.h"
#include <sstream>
#include <type_traits>
/// args push helper
template<typename _Ty> inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const _Ty& arg)
{ // template adapter: must be numeric type
static_assert(std::is_integral<_Ty>::value || std::is_floating_point<_Ty>::value, "error, jsx_unpack: unsupported type!");
ss << arg << ",";
++carg;
}
inline
void jsx_unpack_arg(std::stringstream& ss, int& /*carg*/)
{ // empty arg
}
inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const char* arg)
{ // numbers
ss << "\"" << arg << "\"" << ",";
++carg;
}
inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const std::string& arg)
{
ss << "\"" << arg << "\"" << ",";
++carg;
}
template<typename _Ty, typename..._Args> inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const _Ty& arg1, const _Args&...args)
{
jsx_unpack_arg(ss, carg, arg1);
jsx_unpack_arg(ss, carg, args...);
}
template<typename..._Args> inline
void jsx_vcall(const char* func, const _Args&...args)
{
std::stringstream sstreamArgs;
sstreamArgs.precision(16);
sstreamArgs << func << "(";
int carg = 0;
jsx_unpack_arg(sstreamArgs, carg, args...);
auto actrualArgs = sstreamArgs.str();
if (carg != 0)
actrualArgs.pop_back(); // pop last ','
actrualArgs.append(");");
jsval v1;
if(!ScriptingCore::getInstance()->evalString(actrualArgs.c_str(), &v1)) {
cocos2d::log("jsx_vcall call func:%s failed, please make sure config your project.json properly!");
}
}
#include <sstream>
#include <type_traits>
/// args push helper
template<typename _Ty> inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const _Ty& arg)
{ // template adapter: must be numeric type
static_assert(std::is_integral<_Ty>::value || std::is_floating_point<_Ty>::value, "error, jsx_unpack: unsupported type!");
ss << arg << ",";
++carg;
}
inline
void jsx_unpack_arg(std::stringstream& ss, int& /*carg*/)
{ // empty arg
}
inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const char* arg)
{ // numbers
ss << "\"" << arg << "\"" << ",";
++carg;
}
inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const std::string& arg)
{
ss << "\"" << arg << "\"" << ",";
++carg;
}
template<typename _Ty, typename..._Args> inline
void jsx_unpack_arg(std::stringstream& ss, int& carg, const _Ty& arg1, const _Args&...args)
{
jsx_unpack_arg(ss, carg, arg1);
jsx_unpack_arg(ss, carg, args...);
}
template<typename..._Args> inline
void jsx_vcall(const char* func, const _Args&...args)
{
std::stringstream sstreamArgs;
sstreamArgs.precision(16);
sstreamArgs << func << "(";
int carg = 0;
jsx_unpack_arg(sstreamArgs, carg, args...);
auto actrualArgs = sstreamArgs.str();
if (carg != 0)
actrualArgs.pop_back(); // pop last ','
actrualArgs.append(");");
jsval v1;
if(!ScriptingCore::getInstance()->evalString(actrualArgs.c_str(), &v1)) {
cocos2d::log("jsx_vcall call func:%s failed, please make sure config your project.json properly!");
}
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Extjs4.0 最新最全视频教程
- Javascript中toFixed方法的改进
- 关于指针的一些事情
- 5个常见可用性错误和解决方案
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- js可突破windows弹退效果代码
- JSP脚本漏洞面面观
- 使用BAT一句话命令实现快速合并JS、CSS
- Lua教程(一):在C++中嵌入Lua脚本
- js显示当前星期的起止日期的脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 爆炸式的JS圆形浮动菜单特效代码
- C++联合体转换成C#结构的实现方法
- js select常用操作控制代码
- 从jsp发送动态图像
- 原生js结合html5制作小飞龙的简易跳球
- js 页面模块自由拖动实例
- js实现小鱼吐泡泡在页面游动特效