//############################################################################
/*
* 模板介绍
*/
//函数模板
template<typename T>
T square(T x) {
return x*x;
} //类模板
template<typename T>
class BoVector {
T arr[1000];
int size;
public:
BoVector():size(0) {}
void push(T x) { arr[size] = x; size++; }
T get(int i) const { return arr[i]; }
int getSize() const { return size; }
//void print() const {for(int i=0; i<size; i++) {cout << arr[i] << endl;}}
void print() const {
const int* p = arr;
for(int i=0; i<size; i++) {cout << *(p++) << endl;}
}
}; template<typename T>
BoVector<T> operator*(const BoVector<T>& rhs1, BoVector<T>& rhs2) {
BoVector<T> ret;
for (int i=0; i<rhs1.getSize(); i++) {
ret.push(rhs1.get(i)*rhs2.get(i));
}
return ret;
} int main()
{
cout << square(5) << endl; BoVector<int> bv;
bv.push(2);
bv.push(5);
bv.push(8);
bv.push(9);
bv.print(); cout << "Print squared bv: " << endl;
bv = square(bv);
bv.print();
} //############################################################################
/*
* 函数模板类型省略
*/ template<class T>
void f() {
...
} int main() {
f<int>(); // T显式指定
} // 类型T可以省略
template<class T>
void f(T t) {
...
} int main() {
f(67); // 编译将其绑定为int型 f<long>(67); // 显示告诉编译器为long类型 f(67L);
} //############################################################################
/*
* 关键字typename及其用法
*/ template<class T>
void printAge(T& item) {
...
} template<typename T>
void printAge(T& item) {
...
} //用于模板参数两者等效
//使用typename更易理解
// /*
* Dependent Type 取决于模板参数的类型
*/
template<typename T> A {
vector<T> vec;
} /*
* Nested Dependent Type 包含在某个类里的dependent type
*/
template<typename T> A {
T::age myAge = 9;
vector<T>::iterator itr;
} /*
* typename 用法二
*/
class Dog {
public:
typedef int age;
}; template<class T>
void printMyAge(T& item) {
int n = 9;
T::age* a = &n;
cout << (*a) << endl;
} int main() {
Dog d;
printMyAge<Dog>(d);
} // 上面的代码编译不过,T::age是类型,编译器当成变量 //class Wolf {
// public:
// int age;
//}; /*
* 法则: 当使用嵌套依赖类型的时候总是在前面加上typename,告诉编译器这是类型
*/ // 例外: 在基类列表或者初始化列表中 template<typename T>
class D : public T::NestedBaseClass {
public:
D(int x) : T::NestedBaseClass(x) {
typename T::NestedBaseClass y;
...
}
} //############################################################################
/*
* 模板特化和偏特化
*/
// std是一个特殊的命名空间,我们不能更改它的内容,但是可以为我们的类型提供特化的版本

C++进阶--模板及关键字typename的更多相关文章

  1. 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  2. 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  3. C++ - 模板(template)中typename的使用方法

    声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...

  4. C++ 进阶 模板和STL

    C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 模板的特点: 模板不可以直接使用,它只 ...

  5. Java进阶1. Synchronized 关键字

    Java进阶1. Synchronized 关键字 20131025 1.关于synchronized的简介: Synchronized 关键字代表对这个方法加锁,相当于不管那一个线程,运行到这个方法 ...

  6. C++ 类模板四(typename关键字)

  7. [转] 关于C++中模板中的typename和class的区别比较

    C++箴言:理解typename的两个含义 转自http://blog.csdn.net/dick_china/article/details/4522253 问题:在下面的 template dec ...

  8. OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)

    自从OpenCV推出了Mat后越来越像是Matlab了,使用起来方便了很多,但是,在用at方法访问Mat时,如何选用合适的typename类型来访问相应的Mat元素是个头疼的问题. 比如: int H ...

  9. ansible进阶模板和角色使用

    使用场景 Ansible 由于采用ssh远程连接登录管理,虽然不需要额外安装agent,但是速度慢效率低.不适合管理大规模的主机一般最大规模在200-300台,超大规模的主机管理适合使用puppet ...

随机推荐

  1. python中把数据存入csv中

    import csv # 如果不添加newline=""的话,就会每条数据中间都会有空格行 with open("test.csv","w" ...

  2. MultipartFile(文件的上传)

    摘自:https://www.cnblogs.com/896240130Master/p/6430908.html https://blog.csdn.net/kouwoo/article/detai ...

  3. 20155219&20155224 《信息安全系统设计基础》实验二 固件程序设计

    实验二 固件程序设计-1-MDK 0. 注意不经老师允许不准烧写自己修改的代码 1. 两人(个别三人)一组 2. 参考云班课资源中"信息安全系统实验箱指导书.pdf "第一章,1. ...

  4. PTA——时间转换

    PTA 7-14 然后是几点 #include<stdio.h> int main() { int a,b,hour,min; scanf("%d%d",&a, ...

  5. java-方法重写的注意事项

    1.父类中私有方法不能被重写.因为父类的私有方法子类根本就无法继承. 2.子类重写父类方法时,访问权限不能更低.最好就一致. 3.父类静态方法,子类也必须通过静态方法进行重写.其实这个算不上方法重写, ...

  6. fold算法(拉格朗日插值)

    如果打表发现某个数列: 差分有限次之后全为0 例如: 2017新疆乌鲁木齐ICPC现场赛D题 ,,,,,,,,,,…… [2018江苏南京ICPC现场赛也有这样的题目] 那么可以使用以下黑科技计算出第 ...

  7. Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  8. LeetCode – Group Shifted Strings

    Given a string, we can "shift" each of its letter to its successive letter, for example: & ...

  9. linux令普通用户拥有root权限

    如题,平时我们在自己电脑上玩linux,基本都是一个root用户就够了(反正我99%时间都是直接用root用户登录系统),可如果在公司里就不行了,有时候需要多个用户对系统具有root权限,类似与一个系 ...

  10. uname command

    The command uname helps us in development special in scripts, see help of the uname uname --help Usa ...