背景
作为一个C++程序员,经常喜欢写一些代码小工具,有一天写代码用到了std::bind,需要和std::function配合使用,并且需要传递的参数类型也已经固定,所以我就想能不能写一个类让它可以接受任意类型的可调用对象(C函数,成员函数,静态函数,lambda表达式,重载operator()的类对象等),所以写出来这个CPBind类达成我想要的效果。
思路
在使用C++14 标准的std::any的时候,浅研究了一下std::any的实现原理,瞬间有了大致思路。使用嵌套类模板可以达到想要的效果。这是最核心的思想之一。
区别与bind
- std::bind功能更强大,功能更丰富。CPBind缺少类似_1,_2,...的按位置绑定,目前仅支持顺序绑定。
- 假设两个函数A(std::function<int(int,int)> func), B(CPBind bind)。 那么A接受的可调用对象类型已经固定,即使使用std::bind,类型还是必须需要包括int,int两个参数和返回值为int。而B则没有限制,可以接受任意类型的函数。这是最重要的一个区别,也是为什么要写这个CPBind的原因。
- std::bind绑定的时候,也就是在编辑代码的时候,绑定错误就可以立马发现并修改代码。CPBind在绑定的时候发现不了,调用时剩余参数少传入,调用时剩余参数类型传入错误,这些错误只有运行起来的时候才可以发现。
- 关于第三点的问题后续慢慢看能不能有什么方案来解决。
删除了的部分
1. 每一个CPBind对象可以动态的获取绑定的可调用对象的返回值类型,参数类型,可以按照位置获取每一个参数的类型。
2. 类似std::sequence和std::make_sequence的模板类。有标准的我还写个
标签:std,...,args,const,CPBind,绑定,bindArgs,BindArgs,万能 From: https://blog.csdn.net/m0_56662207/article/details/140400618