您的位置:首页 > 编程语言 > C语言/C++

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;


第一种,只指定了第一个模板参数,使用第二个默认的模板参数。

第二种,指定了两个模板参数。

但是!这不是模板模板参数。因为,一旦指定了第一个模板参数,那么第二个参数的类型就会确定,而真正的模板模板参数,第二个模板参数和第一个模板参数的类型是没有关系的,可以指定为第一个模板参数的类型,也可以指定为其他类型。因此,这不是模板模板参数!!!

以上都是本人自己的理解,如有错误,请谅解并恳请您的指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 pc x