C++11中的变参模板的使用


在新的C++11标准里提供了变参模板,这个类似于在C语言里的printf这个打印函数,参数可以是随机的。当时记得在写嵌入式底层的时候儿需要实现一个类似于printf的函数,还使用var_start,var_end等实现了它。但是从C++0x其实大家都呼吁模板中也提供类似的功能,现在终于有了。

C++11中提供的这个变参模板,可以说功能更强大了,而且应用灵活。可以实现一些原来比较复杂的技术,让其简单明晰化。唠叼了一些,开始扯正题,先看一个简单的实现:

#include

template void Print(T t)//当参数个数等于1是,进入此函数

{

..............................;

}

//当参数个数大于1是,进入此函数

template 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

可以这样使用:

std::tuple _args;

auto curArgs = std::make_tuple(args...);

_args =curArgs;                

然后再通过具体的方法来处理。

但是如果只是单纯的这样使用,确实是有点矫揉造作的嫌疑,其实其更强大的用法如下:

         template

         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();

         }

看到了这种方式,是不是可以推而广之,诸如消息监听,事件链,推送,包括设计模式中的观察者模式都可以使用类似的方法。既简单又清晰明了。

所以说,技术的进步,就是为了解决以前的复杂的问题。

紧紧咬住技术的前沿,才能把技术做得更好。

你可能感兴趣的:(C++11,C++)