您的位置:首页 > 移动开发 > Cocos引擎

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!");
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息