C++ 模板模板参数
2017-07-01 10:43
253 查看
C++ 模板模板参数
1. 模板模板参数
C++模板的使用一共有以下几种情况。函数模板
类模板
模板参数
成员模板
而本篇介绍模板模板参数。
模板参数就是模板的参数,我们一般指定为
T类型,实际上可以使用任何的名字,例如指定一个
Foo的模板参数:
temlate<typename Foo> Foo calc(const Foo& a, const Foo& b) { return a+b; }
而模板模板参数则是模板的参数又是一个模板,例如:
template<typename T, template<typename U> typename Container> class XCls { private: Container<T> c; };
模板的第一个参数是
T类型,第二个参数是一个
Container,他是一个可以指定一个
U类型的变量。
那么如何使用他呢?
template<typename T> class test { private: T t; }; int main(void) { XCls<std::string, test> mylst1; return 0; }
我们可以定义一个模板类,然后将其如上方式传入就可以了。
但是如果传入一个容器呢?比如:
list
XCls<string, list> mylst1;
如果编译就会报错。我们分析一波:
将
string 和 list传入到类
XCls中,然后就会定义一个
list<string>的
c变量,这样看起来是可以的,因此我们使用
list容器的时候就是
list<一个类型>,但是这里为什么就不行呢?是因为
list容器实质上是有第二参数的,虽然第二参数有默认的参数,正如我们平常使用的那样,只需要指定一个参数,但是在这里无法通过编译,因此,我们使用如下解决办法:
template<typename T> using Lst = std::list<T, std::allocator<T>>; XCls<std::string, Lst> mylst2; // 编译时需要加上std=c++11
使用
C++11的
using关键字的新功能,来定义一个类型的别名,而且使用在模板的情况下,因此我们编译时要指定
std=c++11
然后我们将
list的别名
Lst传入进入,就可以编译通过。
2. 这不是模板模板参数
如果是这么定义的模板参数,还会是模板模板参数吗?template<typename T, typename Sequence = list<T>> class stack { private: Sequence c; };
我们定义了一个
stack的模板类,模板参数第一个是
T类型,第二个是一个
Sequence类型,有一个默认的类型是
list<T>。
使用方法有两种:
stack<int> s1; stack<int, deque<int>> s2;
第一种,只指定了第一个模板参数,使用第二个默认的模板参数。
第二种,指定了两个模板参数。
但是!这不是模板模板参数。因为,一旦指定了第一个模板参数,那么第二个参数的类型就会确定,而真正的模板模板参数,第二个模板参数和第一个模板参数的类型是没有关系的,可以指定为第一个模板参数的类型,也可以指定为其他类型。因此,这不是模板模板参数!!!
以上都是本人自己的理解,如有错误,请谅解并恳请您的指正。
相关文章推荐
- Step By Step(C++模板参数)
- C++模板编程->指针及引用模板参数
- C++模板编程->成员函数指针模板参数
- C++ template - 模板的模板参数
- 混沌 IN C++::模板参数的奥秘
- 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename
- C++模板中的函数式参数
- C++模板参数类型(转载)
- [C++] 利用模板的模板参数实现单链表
- c++ template 学习之一:模板参数
- C++模板实现模块间参数传递及回调(一)
- C++模板实现模块间参数传递及回调之二
- C++利用不完全实例化来获得函数模板参数的返回值和参数
- C++变长参数模板
- c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别
- Linux C/C++ 模板:模板术语 模板参数/模板实参/模板名字/模板ID/特化/实例化
- C++ Templates笔记 7 非类型模板参数
- C++箴言:从模板中分离出参数无关的代码
- C++ Has Become More Pythonic ( tuple & 可变模板参数 )
- c++ template(7-1)模板参数声明