主页 > 开源代码  > 

19.5、C++11新特性有哪些⑤【模板的改进】

19.5、C++11新特性有哪些⑤【模板的改进】
模板的改进

模板的右尖括号

C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割,避免发生编译错误。

int main() { std::vector<std::vector<int>> a; // error std::vector<std::vector<int> > b; // ok }

模板的别名(using)

C++11引入了using,可以轻松的定义别名,而不是使用繁琐的typedef,更容易看懂了

//1.模板的别名 typedef std::vector<std::vector<int>> vvi; // before c++11 using vvi = std::vector<std::vector<int>>; // c++11 //2.定义函数指针(不推荐这样做) typedef void (*func)(int, int); // 啥玩意,看不懂 using func = void (*)(int, int); // 起码比typedef容易看的懂吧

函数模板的默认模板参数

C++11之前只有 类模板 支持 默认模板参数,函数模板是不支持默认模板参数的,C++11后都支持

template <typename T, typename U=int> class A { T value; }; //类模板的默认模板参数必须从右往左定义,而函数模板则没有这个限制。 template <typename T=int, typename U> // error class A { T value; }; //默认函数模板使用规则是 如果能够从函数实参中推导出类型的话,则函数模板的默认模板参数则不会被使用;反之,默认模板参数则可能被使用 template <typename R, typename U=int> R func1(U val) { return val; } template <typename R=int, typename U> R func2(U val) { return val; } int main() { cout << func1<int, double>(99.9) << endl; // 99 cout << func1<double, double>(99.9) << endl; // 99.9 cout << func1<double>(99.9) << endl; // 99.9 cout << func1<int>(99.9) << endl; // 99 cout << func2<int, double>(99.9) << endl; // 99 cout << func2<double>(99.9) << endl; // 99.9 cout << func2<int>(99.9) << endl; // 99 return 0; }
标签:

19.5、C++11新特性有哪些⑤【模板的改进】由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“19.5、C++11新特性有哪些⑤【模板的改进】