#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; bool succeed = ScriptingCore::getInstance()->evalString(actrualArgs.c_str(), &v1); assert(succeed); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-17 19:06:01