模板基于源码的替换而不是基于obj的复用
来源:互联网 发布:大数据服务公司 编辑:程序博客网 时间:2024/06/06 07:26
模板提供了代码复用。在使用模板时首先要实例化,即生成一个具体的函数或类。函数模板的实例化是隐式实现的,即由编译系统根据对具体模板函数(实例化后的函数)的调用来进行相应的实例化,而类模板的实例化是显式进行的,在创建对象时由程序指定。
一个模板有很多实例,是否实例化模板的某个实例由使用点来决定,如果未使用到一个模板的某个实例,则编译系统不会生成相应实例的代码。
在C++中,由于模块是分别编译的,如果在模块A中要使用模块B中定义的一个模板的某个实例,而在模块B中未使用这个实例,则模块A无法使用这个实例,除非在模块A中也定义了相应的模板。因此模板是基于源代码复用,而不是目标代码复用。
例:
// file1.h
template <class T>
class S
{ T a;
public:
void f();
};
// file1.cpp
#include "file1.h"
template <class T>
void S<T>::f()
{ …
}
template <class T>
T max(T x, T y)
{ return x>y?x:y;
}
void main()
{ int a,b;
float m,n;
max(a,b);
max(m,n);
S<int> x;
x.f();
}
// file2.cpp
#include "file1.h"
extern double max(double,double);
void sub()
{ max(1.1,2.2); //Error,no appropriate instance
S<float> x;
x.f(); //Error, corresponding instance has no appropriate implementation
}
一个模板有很多实例,是否实例化模板的某个实例由使用点来决定,如果未使用到一个模板的某个实例,则编译系统不会生成相应实例的代码。
在C++中,由于模块是分别编译的,如果在模块A中要使用模块B中定义的一个模板的某个实例,而在模块B中未使用这个实例,则模块A无法使用这个实例,除非在模块A中也定义了相应的模板。因此模板是基于源代码复用,而不是目标代码复用。
例:
// file1.h
template <class T>
class S
{ T a;
public:
void f();
};
// file1.cpp
#include "file1.h"
template <class T>
void S<T>::f()
{ …
}
template <class T>
T max(T x, T y)
{ return x>y?x:y;
}
void main()
{ int a,b;
float m,n;
max(a,b);
max(m,n);
S<int> x;
x.f();
}
// file2.cpp
#include "file1.h"
extern double max(double,double);
void sub()
{ max(1.1,2.2); //Error,no appropriate instance
S<float> x;
x.f(); //Error, corresponding instance has no appropriate implementation
}
0 0
- 模板基于源码的替换而不是基于obj的复用
- 基于用户行为的测试,而不是基于方法的测试
- 基于模板的简易代码生成器Python源码
- 基于边缘的模板匹配
- 基于模板的冒泡排序
- 2.基于html5的模板
- 基于形状的模板匹配
- 基于模板的excel导出
- PGM:基于模板的表示
- 【模板】基于旋转的Treap
- 基于c++的函数模板
- obj-C 基于索贝尔算子的彩色素描效果
- 基于hash表的文件字符串替换
- 基于匹配模式的字符串替换
- 基于Instrumentation的JAVA代码热替换
- 《ASCE1885的源码分析》の基于冒泡排序的二分查找模板
- 标准的基于欧式距离的模板匹配算法优源码化和实现
- 标准的基于欧式距离的模板匹配算法优源码化和实现(附源代码)。
- Flex使用问题汇总
- mysql_escape_string导致的数据回滚
- Linux 的xargs命令
- java中数据类型在内存中存储的方式
- Mongodb开启与关闭
- 模板基于源码的替换而不是基于obj的复用
- Linux内核跟踪之syscall tracer
- 游戏AI模块设计--行为树
- Java图形界面事件监听处理之四种方法
- 对话框式activity
- spring:Circular placeholder reference 'XXX' in property definitions
- 求旱冰场造价[贺老师规定]
- JD 1552:座位问题
- 基于ffmpeg的Android播放器开源代码