C++(模板)
文章平均质量分 96
template
sssnial-jz
这个作者很懒,什么都没留下…
展开
-
模板头文件、源文件
当模板遇见.h和.cpp的错误分析 头文件 //first.h template<typename T> void FUN(T); 源文件 #include"first.h" template<typename T> void FUN(T parameter) { cout << parameter << endl; } 以上头文件中声明了一个...原创 2021-04-04 10:20:09 · 1108 阅读 · 0 评论 -
metaprogram
一个简单的metaprogramming实例: 一个计算从1加到100的例子: 1,用普通函数递归实现 //用普通函数实现递归 double SumFunc(int N){ double sum = N; //递归结束开始返回的条件 if (N == 1){ return sum; } else{ //递归展开代码 sum = sum + SumFunc(--N...原创 2021-04-05 10:02:47 · 265 阅读 · 0 评论 -
模板和反射
1,辨别基本类型 文件IsFunda.h #ifndef ISFUNDA #define ISFUNDA //用来判断一个类型是否是基本类型的模板 template<typename T> class IsFunda{ public: enum{yes=0,no=1};//没有经过特化的类型都不是基本类型 }; //用于特化的宏 #define MK_FUNDA_TYPE(...原创 2021-04-05 10:02:00 · 355 阅读 · 0 评论 -
Template and Inheritance
把梦想实现为现实 我们要实现的梦想: template< typename Policy1 = DefaultPolicy1, typename Policy2 = DefaultPolicy2, typename Policy3 = DefaultPolicy3, typename Policy4 = DefaultPolicy4, typ...原创 2021-04-05 10:02:59 · 235 阅读 · 0 评论 -
Template parameter deduction
演绎的过程 关于模板演绎的一个示例: #include<iostream> using namespace std; template<typename T> typename T::type FUN(T* t) { return t[5]; } void main() { int * p=0; int x = FUN(p); } 上面的示例是错误的,错...原创 2021-04-04 10:21:36 · 333 阅读 · 0 评论 -
Template instantiation analysis
On_Demand实例化 对于一个类X,在哪些情况下必须要求看到X的定义: (对于怎样判断一个行为是声明还是定义,已在我的这篇文章中有所论述:《将模板声明头文件和模板定义源文件分离》) 1,创建X类型的对象时:不论这种创建是直接的还是间接的(例如X类型对象作为另一个类的成员被创建),都必须看到X的定义,因为创建一个对象,就要知道类型的内存布局,而没有定义,怎么会知道内存布局呢?对于直接...原创 2021-04-04 10:20:59 · 238 阅读 · 0 评论 -
Static polymorphism
动多态和静多态 多态:单一的泛型标记关联不同特定行为的能力 动多态:利用继承和虚函数实现的多态(继承保证了可以提供一个泛型的标记(基类指针或引用),虚函数中实现不同的特定行为)——特点是运行期处理 静多态:特点是编译期处理 什么是静多态! 动多态: #include<iostream> using namespace std; class Base{ ...原创 2021-04-05 10:03:22 · 174 阅读 · 0 评论 -
trait和policy
什么是trait和policy: 用一个例子来说明: AccumutionTraits头文件: #ifndef ACCUMUTIONTRAITS #define ACCUMUTIONTRAITS //与T相关的Trait都被定义在这里了 template<typename T> class AccumutionTraits; //char template<> ...原创 2021-04-05 10:03:09 · 350 阅读 · 1 评论 -
Names in templates
模板中一些重要的名称 1,运算符id:在关键字operator后面紧跟一个运算符符号——operator [] 2,类型转换函数id:用来表示用户自定义的类型准换运算符——operator int 3,受限id:一般这个名称被表示属于哪一个作用域,则称这个名称为受限id——X::member、this->member、::fun() 4,非受限id——和受限id相对,一般的名称都是非...原创 2021-04-04 10:20:28 · 139 阅读 · 0 评论 -
Specialization and Overload
函数模板重载会选择更特殊的函数模板 一个例子: #include<iostream> #include<vector> using namespace std; template<typename T> void FUN(T & t1,T & t2) { cout << "conmon"<<endl } tem...原创 2021-04-04 10:21:17 · 105 阅读 · 0 评论 -
expression template
写在前面的话:模板充斥着无限的可能性 表达式模板和metaprogramming:metaprogramming主要用于大小固定的、小的数组,表达式模板适用于能够在运行期确定大小、中等大小的数组(关于metaprogramming,在我的文章《metaprogram(元编程初探)》) 一个传统的数值数组操作程序: Traits头文件: #ifndef TRAIT #defin...原创 2021-04-05 10:02:13 · 322 阅读 · 0 评论