C++11&14新标准——模板模板参数(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)
?? 模板模板参数(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最大的区别。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!