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;
}