C++调用JS,可变参模板实现,方便调用

#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-08-09 16:21:30

C++调用JS,可变参模板实现,方便调用的相关文章

vue.js 学习之模板语法详解

本文和大家分享的主要是vue.js 的模板语法,希望对大家学习vue.js有所帮助,一起来看看吧. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析. 在底层的实现上, Vue 将模板编译成虚拟 DOM 渲染函数.结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上. 如果你熟悉虚拟 D

C++11变参模板

在C++11中出现的变参模板,可以让我们不需关心函数调用的参数多少,类似实现C中的printf函数那样. 变参依赖于C++强大的模板 可以这样声明 template<class T1,class... Args>   //   Args就是一种类型参数包,在定义的函数中需要递归去解析 void MutiArg(const T1&t1,Args... args) { //  do something with t1对第一个调用参数进行操作 MutiArg(args...);  //对参数

编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异

编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异 题目挺绕口的.C++ 11的好东西不算太多,但变参模板(Variadic Template)肯定是其中耀眼的一颗明星,在C++设计新思维中,你可以看到很多模版的代码为了支持不确定的参数个数,而要重载1个参数到N个模板参数的N个函数.虽然种代码一般也是用会用宏和脚步辅助生成.但我想也没有人愿意看到几千行这种单调的函数.通过这个东东,模板的威力可以爆发. 目前的最新的编译器基本都已经支持Variadic Tem

doT.js——前端javascript模板引擎问题备忘录

我手里维护的一个项目,遇到一个问题:原项目的开发人员在Javascript中,大量的拼接HTML,导致代码极丑,极难维护.他们怎么能够忍受的了这么丑陋.拙劣的代码呢,也许是他们的忍受力极强,压根就没想去寻找解决方法. 可是,我,是万难不能接受这种丑陋的解决方式的.有没有优雅的解决方法呢,于是在网上搜索到了doT.js. 主页很简洁,就一个页面,研究了一下,就顺利的上手了,相当的简单易用.主要分两步走. 1.写模板 写模板,就用官方文档里提供给你的三板斧就搞定了,当然总共不止三个: {{ }} f

Magento中调用JS文件的几种方法

一.全局调用方法: 通过该方法每个页面都会引用这个JS文件,除非是类似jQuery这样的系统文件,不然不推荐这种方法. 文件路径:/app/design/frontend/default/Your_Template/layout/page.xml 你会看到很多类似于addJS这样的XML代码,这是magento的优势之一,通过XML来配置文件很方便灵活. 如下: Xml代码   <action method="addJs"><script>varien/js.j

python调用js

安装 pip install PyExecJS 方法 eval() 输入参数:source(JS语句).cwd(路径) 返回值:result(语句执行结果) compile() 输入参数:source(JS语句).cwd(路径) 返回值:编译后的对象 call() 输入参数:name(要调用的JS方法名称).*args(方法所需要的参数,可多个) 返回值:result(运行方法的返回结果) 模板 执行JS语句 import execjs result=execjs.eval("1+1"

谷歌、火狐浏览器下实现JS跨域iframe高度自适应的完美解决方法,跨域调用JS不再是难题!

谷歌.火狐浏览器下实现JS跨域iframe高度自适应的解决方法 导读:今天开发的时候遇到个iframe自适应高度的问题,相信大家对这个不陌生,但是一般我们都是在同一个项目使用iframe嵌套页面,这个ifame高度自适应网上一搜一大把,今天要讲的如何在不同的网站下进行相互的调用跟在同一个网站下是一个效果:例如我在自己的项目里面Iframe  了第一博客的页面  http://www.diyibk.com/   当第一博客的页面高度变化了怎么通知父页面呢? 这个时候在谷歌下肯定是拿不到 ifram

Delphi 中调用JS文件中的方法

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ComObj,ActiveX; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button

WebView Android 调用js且须要获取返回结果

Android webView调用js方法非常easy, webView.loadUrl("javascrpt:yourFunction()"); 可是此方法没有办法获取返回结果 此时仅仅能通过调用alert方法,然后通过重写WebChromClient中的onJsAlert方法,来获取到返回结果. 比如webView.loadUrl("javascript:alert(yourFunction())") 此时WebChromClient中的onJsAlert方法中

C#调用JS方法、以QQ登录密码的md5为例

C# 调用代码 ScriptControlClass js = new ScriptControlClass(); js.Language = "JScript"; js.AddCode(textBox2.Text);//JS代码 string result = null; result = js.Eval(textBox1.Text).ToString(); //调用函数 MessageBox.Show(result); MD5 JS代码 function md5js(pass, c