C++之新特性之variadic Templates
一、variadic Templates(参数不定的模板参数)
第一次体会到泛型编程的巨大威力:震撼!!
传入多个参量,然后不断的调用,当print()只有一个参数时,根据函数重载就会调用上面的那个print。
使用sizeof...(args)得到参数的个数。
另外使用多参数模板可以很方便的完成recursive function call
再来看一个使用Variadic Templates构成Tuple
二、nullptr and std::nullptr_t
三、auto
四、Uniform Initialization(一致性初始化)
C++11提供了一个一致性初始化方法(Uniform Initialization),它使用大括号(braces).
如下所示:
其实是利用一个事实:编译器看到{t1,t2,...tn}便做出一个initializer_list<T>,它关联到一个array<T,n>.调用函数(例如ctor(构造函数))时该array内的元素可以被编译器分解,然后逐一传递给函数(ctor).如例2所示
但若函数参数本身就是一个initializer_list<T>,调用者却不能给与数个T参数,然后以为他们会自动转换为一个initializer_list<T>传入。而是直接作为一个包(pack)传入的:如例1所示
例1:例如:vector<string>cities{ "Beijing,Shanghai,Guangzhou" };这形成一个initializer_list<string>,背后有一个array<string,6>,调用vector<string>ctors时,编译器找到了一个vector<string>ctor接受initializer_list<string>,刚好作为一个包传入,所有容器都有这样的ctor.
例2:而complex<double>c{ 4.0,3.0 }; 会形成一个initialize_list<double>,背后有个array<double,2>,调用该complex<double>ctor时,该array内的2个元素被分解传给ctor,complex<double>并无任何ctor接受initialize_list<double>
五、Initializer Lists
Initializer Lists的用法在于其对于参数的个数没有限定,但是variadic Templates不仅对于参数个数没有限制,而且对于参数的类型也没有限制。