16.1
编译器用推断出的模版参数来为我们实例化一个特定版本的函数,当编译器实例化一个模版时,它使用实际的模版实参代替对应的模版参数来创建出一个新"实例"
16.2
template <typename T>
int compare(const T &l, const T &r){
if(l < r){
return -1;
}
if(r < l){
return 1;
}
return 0;
}
16.3
16.4
template <typename T, typename U>
T myFind(T &l, const U& val) { //未做越界检查
while (*l != val)
{
++l;
}
return l;
}
int main() {
vector<int > vec = {1,2,3,4,5};
cout << *myFind(vec.begin(), 3) << endl;
for (;;);
return 0;
}
16.5
template <typename T, unsigned U>
void myPrint(const T (&l)[U]) {
for(auto tmp : l){
cout << tmp << ends;
}
cout <<endl;
}
int main() {
int a[10] = { 1,2,3,4,5,67,8,9,10 };
char b[10] = {'a','b','c','d','e','f','g','h','i','j'};
myPrint(a);
myPrint(b);
for (;;);
return 0;
}
16.6
template<typename T, unsigned U>
T* myBegin(const T (&val)[U]){
return &val[0]
}
template<typename T, unsigned U>
T* myEnd(const T(&val)[U]) {
return &val[U-1]
}
16.7
template<typename T, unsigned U>
constexpr
int getArrLength(T(&val)[U]){
return U;
}
16.8
在标准库容器中中,<不一定会被定义,而!=都是被定义的