C++调用JS,可变參模板实现,方便调用(cocos2d-x)

Posted ljbguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++调用JS,可变參模板实现,方便调用(cocos2d-x)相关的知识,希望对你有一定的参考价值。

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



以上是关于C++调用JS,可变參模板实现,方便调用(cocos2d-x)的主要内容,如果未能解决你的问题,请参考以下文章

Cocos Creator 中的js文件之间调用变量或类

对重载可变参数模板函数的歧义调用

可变參数列表

如何在cocos2d c++代码中调用lua以及探究

如何在cocos2d c++代码中调用lua以及探究

cocos2dx C++关于cocos2dx的C++调用创建项目