//############################################################################
/*
* 模板介绍
*/
//函数模板
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. 论container的前世今生

    why Normally, thin-client multitiered applications are hard to write because they involve many lines ...

  2. rsync命令

    1.rsync命令(文件同步工具,可以理解为动态备份): rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsy ...

  3. find 以及linux 和windows 文件互传

    1. find  命令  查找文件或目录 同时也会用到的有 which   whereis   locate   经常也会遇到一些快捷键  ctrl  +  l  e  a  w  u  k     ...

  4. java-源文件中可以有多个类,但是最多只能有一个public修饰

    1.如果源文件中有多个类,那么只能有一个类是public类:如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java. 2.如果源文件中没有public类,那么源文 ...

  5. C++学习(十九)(C语言部分)之 指针3

    复习1.一级指针 int*p 指向int的指针 赋值 int x; p=&x;// *p=2; 指针指向的谁 解引用之后就是谁2.内存四区 堆区 需要自己手动申请内存 自己释放 (malloc ...

  6. linux----别名

    经常一些命令太长,输入太麻烦,给该命令起个别名,直接执行,简单又方便. 1.查看别名 alias 2.编辑别名 vi ~/.brashrc 3.添加自己的别名 例如:重启网卡 alias netres ...

  7. Maven命令安装jar包到本地仓库

    https://blog.csdn.net/moxiong3212/article/details/78767480 当需要的jar包在中央仓库找不到或者是想把自己生成的jar包放到的Maven仓库中 ...

  8. 【Disruptor】之Ringbuffer

    一.Ringbuffer的概念 =>是一个环形数据队列的数据结构 =>嗯,正如名字所说的一样,它是一个环(首尾相接的环),你可以把它用做在不同上下文(线程)间传递数据的buffer. =& ...

  9. SpringBoot企业级博客开发

    1.springboot生成项目 PS : 进入项目,输入gradle build,生成build文件夹:  然后进入libs有jar,使用java jar进行运行项目 PS: 这个项目没有准守res ...

  10. webbrowser 响应关闭事件

    void registerEvents(System.Windows.Forms.WebBrowser web) { var rnd = new Random(); ]; if (head == nu ...