
本文共 1233 字,大约阅读时间需要 4 分钟。
在新的C++11标准里提供了变参模板,这个类似于在C语言里的printf这个打印函数,参数可以是随机的。当时记得在写嵌入式底层的时候儿需要实现一个类似于printf的函数,还使用var_start,var_end等实现了它。但是从C++0x其实大家都呼吁模板中也提供类似的功能,现在终于有了。
C++11中提供的这个变参模板,可以说功能更强大了,而且应用灵活。可以实现一些原来比较复杂的技术,让其简单明晰化。唠叼了一些,开始扯正题,先看一个简单的实现:
#include <iostream>
template<typename T> void Print(T t)//当参数个数等于1是,进入此函数
{
..............................;
}
//当参数个数大于1是,进入此函数
template<typename T,typename ...Args> void Print(T t, Args ... args) {
......................................
Print(args...);
}
int main(int argc, char* argv[])
{
Print(101,‘d’, 1, 3.0, "name");
}
这里有一个函数,可以提供对可变参数的的数量多少提供支持:sizeof...这个函数,注意,后面是有三个小点点的,不是多写了,使用的方法如下:
sizeof...(args))...
通过上面的的简单实例可以发现,这个模板使用的是递归调用自己来实现的,如果需要处理多个参数的关系,这个就得借助其它的方式了,比如:
std::tuple<Args...>
可以这样使用:
std::tuple<Args...> _args;
auto curArgs = std::make_tuple(args...);
_args =curArgs;
然后再通过具体的方法来处理。
但是如果只是单纯的这样使用,确实是有点矫揉造作的嫌疑,其实其更强大的用法如下:
template<classF, class... Args>
autoTest(F&& f, Args&&... args) ->void {
auto curArgs = std::make_tuple(args...);
lock();
for(auto &cur:_instance)
{
//使用std::bind去绑定具体对象,并调该对象的方法
//注意,如果没有类对象,则可以不要_cur
std::bind(f,_cur, args...)();
}
unlock();
}
看到了这种方式,是不是可以推而广之,诸如消息监听,事件链,推送,包括设计模式中的观察者模式都可以使用类似的方法。既简单又清晰明了。
所以说,技术的进步,就是为了解决以前的复杂的问题。
紧紧咬住技术的前沿,才能把技术做得更好。
发表评论
最新留言
关于作者
