本文主要是介绍C++1114新标准——模板模板参数(Template Template Parameter)、using,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
系列文章目录
C++11&14新标准——Variadic templates(数量不定的模板参数)
C++11&14新标准——Uniform Initialization(统一初始化)、Initializer_list(初始化列表)、explicit
C++11&14新标准—— =delete、=default
C++11&14新标准——模板模板参数(Template Template Parameter)、using
文章目录
- 系列文章目录
- 1. 模板模板参数(Template Template Parameter)
- 2. Using
- Using、#define、typedef
1. 模板模板参数(Template Template Parameter)
模板模板参数(Template Template Parameter)的意思是在原有的模板参数的基础上,在内部再嵌入一个模板参数,实现一些模板容器的功能。
例如下图的test_moveable函数,内部需要一个模板容器,容器成员类型也为模板,如果直接使用两个模板参数,这样是行不通的,报错信息为:Container不是一个模板。
但可以通过模板参数+迭代器+萃取器的方法,实现这个功能。输入一个模板容器,通过对这个模板容器的迭代器进行萃取,得到迭代器所指类型的型别,实现这个功能,这是一种可行的方法。
但更好的方式是使用模板模板参数。可以看到container既是一个模板参数,同时他自身也是一个模板,这样就可以实现模板容器。
2. Using
上文设计好XCIs类之后,尝试用vector去实例化一个对象,但会发现报错。
这其实是因为我们的XCIs类第二个模板参数container,他自身作为一个模板只能接受一个参数,但vector其实有两个参数——数据类型和分配器,第二个参数有默认值。
这时候就可以通过using关键词,将之前的两参数容器提前处理,变为单一参数模板,从而可以正常实例化。
Using、#define、typedef
#define是一个预处理指令,用于进行文本替换,不仅仅用于定义类型别名,还可用于宏定义、条件编译等。
#define MyInt int
#define DoubleVector std::vector<double>
typedef是传统的 C++ 中用于定义类型别名的关键字,它在 C++98 就已存在,typedef 用于给类型起别名。
typedef int MyInt;
typedef std::vector<double> DoubleVector;
using 是 C++11 引入的关键字,用于定义类型别名。它提供了更直观、类型安全的方式来定义别名。格式为:
using MyInt = int;
using DoubleVector = std::vector<double>;
using最大的特点就是支持模板操作,可以用于模板别名,支持模板参数的自动推导。这也是他与typedef最大的区别。
这篇关于C++1114新标准——模板模板参数(Template Template Parameter)、using的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!