用C++11实现C++17的apply(动态数组用作函数参数)
标题有点错误,apply是用tuple做参数,调用一个函数。这个标题是为了能更好的适配搜索关键字。
动态数组用作函数参数更适合嵌入了脚本环境的C++程序,比如lua或javascript(js)。
若有疏忽或改进,请评论,谢谢。
VS2017虽然实现了一些C++17特性,但没有apply(也许我没发现或有替代),而且即使以后更新添加了,也不是很满足我提到的数组转参数列表。
下面是VS2015.3测试通过的代码。
写脚本封装(Wrapper)功能一般都是把C++函数(一般是成员函数)注册到脚本的环境,我看了很多开源作者都重载了很多模板类/模板函数,其实都挺类的,虽然都是一些体力活,但一旦修改就是批量的。
本文参考了stackoverflow的Johannes Schaub的回复,附录有链接。
代码中的intint只是一个自动转换例子而已,什么也没做,你可以替换为你的脚本对象转原生对象的转换器。
代码的核心部分是嵌套的模板类继承,这一段比较烧脑子:
template<int ...>struct seq {};
template<int N, int ...S> struct gen_seq : gen_seq<N - , N - , S...> {};// 嵌套继承,为了得到一个N-M至N的参数序列,是无限的
template<int ...S> struct gen_seq<, S...> { typedef seq<S...> type; };// 特例。对上面嵌套继承的一个终止,终止条件是1开始到N
全部代码,无输出,请自行添加,同样,也不需要其它头文件:
struct intint {
int i;
intint(int i) :i(i) {}
operator int() { return i; }
};
template<int ...>struct seq {};
template<int N, int ...S> struct gen_seq : gen_seq<N - , N - , S...> {};
template<int ...S> struct gen_seq<, S...> { typedef seq<S...> type; };
template<typename T, typename R, typename...TS>
struct callable {
typename gen_seq<sizeof...(TS)+>::type fo;
R(T::*func)(TS...);
callable(R(T::*func)(TS...)) :func(func) {}
template<int ...S>
void call(seq<S...>, int* v) {
(new T->*func)(intint(v[S])...);
}
void operator()(T*, int* v) {
call(fo, v);
}
};
struct foo
{
void func(int, int, int, int) {
}
};
int main()
{
callable<foo, void, int, int, int, int> c(&foo::func);
int v[] = { ,,,,, };
c(new foo(), v);
return ;
}
附:【“unpacking” a tuple to call a matching function pointer】
用C++11实现C++17的apply(动态数组用作函数参数)的更多相关文章
- 2017.11.13 在C语言中是否能用函数实现模块化程序设计
第七章 用函数实现模块化程序设计 (1)为什么要用函数? @function既是函数也是功能.函数就是用来完成一定功能的的(函数就是功能),函数名就是给这个功能起一个名字,一个C程序可由一个主函数和若 ...
- JZ2440 u-boot-2016.11、linux-4.17和busybox-1.28.4移植笔记
2018年5月份开始在JZ2440上陆续移植了u-boot-2016.11.u-boot-spl-2016.11.linux-4.17和busybox-1.28.4,其中linux-4.17和busy ...
- [转帖]支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么?
支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么? https://mp.weixin.qq.com/s?__biz=MzA3OTg5NjcyMg==&mid=2661671930 ...
- C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则
背景: 最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言: ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为s ...
- 【JavaScript】[bind,call,apply] (function cal(){}());声明函数立即执行
---恢复内容开始--- 1.js 里函数调用有 4 种模式:方法调用.正常函数调用.构造器函数调用.apply/call 调用.同时,无论哪种函数调用除了你声明时定义的形参外,还会自动添加 2 个形 ...
- 当call/apply传的第一个参数为null/undefined的时候js函数内执行的上下文对象是什么呢?
如题:在js中我们都知道call/apply,还有比较少用的bind;传入的第一个参数都是改变函数当前上下文对象;call/apply区别在于传的参数不同,一个是已逗号分隔字符串,一个以数组形式.而b ...
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- 纯数据结构Java实现(1/11)(动态数组)
我怕说这部分内容太简单后,突然蹦出来一个大佬把我虐到哭,还是悠着点,踏实写 大致内容有: 增删改查,泛型支持,扩容支持,复杂度分析.(铺垫: Java语言中的数组) 基础铺垫 其实没啥好介绍的,顺序存 ...
随机推荐
- 【angularjs】【学习心得】ng-class总结
原文:http://www.imooc.com/wenda/detail/236998 今天来说一点angularjs中看起来很简单但是实践起来又有不少问题的ng-class吧 ----------- ...
- because of many connection errors; unblock with 'mysqladmin flush-hosts
环境:linux,mysql5.5.37 错误:Host is blocked because of many connection errors; unblock with 'mysqladmin ...
- SQL查询根节点
/* 标题:查询指定节点及其所有父节点的函数 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-05-12 地点:广东深圳 */ create table tb(id varcha ...
- doubango(5)--SIP协议栈传输层的启动
SIP协议的INVITE消息发起流程 当通过sip协议发起一个会话时,需要通过invite消息实现该流程.而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的. ...
- ARPU值分析
每用户平均收入(“ARPU)它由一个消费群体消费总额除以群体总人数得到. 活跃付费账户(“APA”) 平均同时在线玩家人数(“ACU”) 最高同时在线玩家人数(“PCU”)同时在线玩家数最高峰. 千人 ...
- TCP&UDP
TCP(传输控制协议) 建立连接,形成传输数据的通道 在连接中进行大数据传输(数据大小不受限制) 通过三次握手完成连接,是可靠协议,安全送达(三次握手向服务器发送请求,响应请求回复,发送数据) 必须建 ...
- 《微信小程序七日谈》- 第七天:不要捡了芝麻丢了西瓜
<微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩: 第五 ...
- 如何使用Babel将ES6转码为ES5?
一.前言: 当我们还在沉迷于ES5的时候,殊不知ES6早就已经发布几年了.时代在进步,WEB前端技术也在日新月异,是时候做些改变了! ECMAScript 6(ES6)的发展速度非常之快,但现代浏览器 ...
- 关于js 构造 onclick 方法中传递Guid参数问题
转义字符单双引号用法:\' 与 \" 例如: $.getJSON("data.json", function(data, status, xhr) { $(" ...
- PHP递归遍历指定文件夹内的文件
今天早上在地铁上看了关于文件和文件夹的一章,正好最近刚搞懂linux的文件系统,觉得对文件属性的访问跟Shell命令很像,所以想晚上来实践一下. 发现php的文件夹函数好像没有提供遍历文件夹下的所有文 ...