ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++模板精选

2021-02-28 00:01:40  阅读:120  来源: 互联网

标签:const 函数 C++ 精选 参数 template class 模板


C++模板的使用一共有以下几种情况。
• 函数模板
• 类模板
• 模板参数
• 成员模板

//empty case
template
struct GetInputView<Continuation,ViewList<>>:public Continuation {
template
static void data_deps(IOVec *deps){
Continuation::template data_deps

(deps);
}
};

使用的时候
Ad* allocate_adv(){
return this->_data->template alloc_adv();
}

2 函数模板
template
inline T const& max(T const& a, T const& b) {
return a < b ? b : a;
}
1 通过实参对函数模板实例化
2 可以显式指定模板参数
3 可以重载函数模板
4 一定要让所有函数模板的声明位于调用之前

vector 取最后/前一个元素是back() front()
删除最后是pop_back()

c string的模板传引用需要退化

3 类模板
类模板声明
template
class Stack {

};

类模板的特化
template <>
class Stackstd::string {

};

局部特化
template <typename T1, typename T2>
class Stack{

};
template
class Stack<T, T> {

};
template <typename T1, typename T2>
class Stack<T1*, T2*> {

};

缺省模板参数
template <typename T, typename CONT = std::vector>
class Stack {
CONT elems;

};
特定类型特化类模板
特定类型局部特化类模板
缺省模板参数值,这些值可以引用前面的模板参数

4 非类型模板参数
非类型的类模板参数
template <typename T, int MAXSIZE>
class Stack {
T elems[MAXSIZE];

};
非类型的函数模板参数
template <typename T, int VAL>
T addValue(const T& x) {
return x + VAL;
}
非类型模板参数的限制
可以是常整数(包括枚举值)或者指向外部链接对象的指针,不能使用浮点数,class类型对象和内部链接对象

5 技巧性
typename 当某个依赖于模板参数的名称是一个类型时,需要使用typename
typename T::const_iterator pos;

.template 构造,只有当前面存在依赖于模板参数的对象时,需要在模板内部使用.template标记 ->template

this-> 在基类中声明,并且依赖于模板参数的符号(函数或变量等),子类调用需要在前面加上this->或者Base::限定访问

成员模板:只有被调用的成员函数才会实例化

模板的模板参数:
模板模板参数则是模板的参数又是一个模板,例如
template<typename T, template typename Container> class XCls { private:
Container c;
};
模板的第一个参数是T类型,第二个参数是一个Container,他是一个可以指定一个U类型的变量。
那么如何使用他呢?
我们可以定义一个模板类,然后将其如上方式传入就可以了。
template class test {
private:
T t;
};
int main(void) {
XCls<std::string, test> mylst1;
return 0;
}

template <typename T, template class CONT = std::deque>
class Stack {
CONT elems;

};

借助模板的模板参数,不需要指定模板类所含元素的类型:
Stack<int, std::vector>
不需要详细指定
Stack<int, std::vector>
作为模板的声明,通常可以使用typename来替换class,然而CONT定义为一个类,只能使用class
成员函数支持模板的模板参数,函数模板不支持模板的模板参数

零初始化
int,double,或者指针等基本类型,不存在用一个缺省的值来对他们初始化的缺省构造函数,因此任何为初始化的局部变量都具有不确定值。
为了确认所有成员都已经初始化完毕,需要定义缺省构造函数,通过一个初始化列表来初始化类模板的成员

使用字符串作为函数模板的实参
template
inline T const& max(T const& a, T const& b) {
return a < b ? b : a;
}

::max(“apple”, “tomato”);
"apple"被演绎成char const[6],"tomato"被演绎成char const[7],类型并不一样,导致不能进行比较。
因此声明为非引用类型,出现数组到指针的类型转换(这种转换称为decay)

对于字符数组和字符指针之间的不匹配,解决方法是:
1 使用非引用参数(会导致拷贝)
2 进行重载,编写引用和非引用重载函数,易导致二意性
3 对具体类型重载,如std::string
4 重载数组类型, 如
template<typename T, int N, int M>
inline T const* max(T const (&a)[N], T const (&b)[M]) {
return a < b ? b : a;
}
5 强制使用显式类型转化

第六章 模板实战

包含模型
显式实例化
template void print_typeof(double const &);
已经显式实例化的不能再次显式实例化
分离模型
通过export导出,大部分编译器不支持
export template void print_typeof(double const &);
export 不能和inline同时使用

第七章 模板术语
类模板(template class):整个类家族的参数化描述
模板类(class template):
作为类的同义词
从模板产生的类
具有template-id名称的类

声明和定义
对于变量 进行初始化和不再具有extern关键词的声明都是定义。分配内存空间,那么就是定义
对于类类型或者函数 必须有一对花括号内部的实体
类模板或者函数模板的声明,如果本身具有代码实体,为定义
一处定义原则
全局变量和静态数据成员,整个程序中,非内联函数和成员函数只能被定义一次
类类型和内联函数在每个翻译单元中最多只能定义一次,如果存在多个翻译单元,所有的定义必须是等同的
一个翻译单元:预处理一个源文件所获的的结果:他所包含的#include文件内容

标签:const,函数,C++,精选,参数,template,class,模板
来源: https://blog.csdn.net/miko_xiaoming/article/details/114198846

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有