手机网站模板演示百度百家
模板的改进
-
模板的右尖括号
C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割,避免发生编译错误。
int main() {std::vector<std::vector<int>> a; // errorstd::vector<std::vector<int> > b; // ok}
-
模板的别名(using)
C++11引入了using,可以轻松的定义别名,而不是使用繁琐的typedef,更容易看懂了
//1.模板的别名typedef std::vector<std::vector<int>> vvi; // before c++11using 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> // errorclass 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; // 99cout << func1<double, double>(99.9) << endl; // 99.9cout << func1<double>(99.9) << endl; // 99.9cout << func1<int>(99.9) << endl; // 99cout << func2<int, double>(99.9) << endl; // 99cout << func2<double>(99.9) << endl; // 99.9cout << func2<int>(99.9) << endl; // 99return 0;}