1.
模板模板参数指的是模板的参数又是一个模板。
示例:
#include <iostream>
#include <list>
using namespace std;
template<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;
};
template<typename T>
class test
{
private:
T t;
};
int main()
{
XCls<string, test> mylst1;
while (1);
return 0;
}
对于XCls类而言,其模板的第一给参数是T类型,第二个参数是Container,它是一个可以指定一个U类型的变量。
2.
注意:
XCls<string,list> mylst1; 编译器就会报错,分析如下:将string和list 传入到类XCls中,然后就会定义一个list<string>的c 变量,这样看起来是可以的,但实际上list容器实际上是有第二参数的,虽然第二参数有默认的参数,正如我们平常使用的那样,只需要指定一个参数,但在这里无法通过编译,因此,我们可以使用如下的解决方法:
template<typename T, typename Sequence=list<T>>
class stack
{
private:
Sequence c;
};
3.
我们定义了一个stack的模板类,模板参数第一个是T类型,第二个是一个Sequence类型,有一个默认的类型是list<T>
使用方法有两种:
stack<int> s1;
stack<int,deque<int>> s2;
但这不是模板模板参数,因为一旦指定了第一个模板参数,那么第二个参数的类型就会确定,而真正的模板模板参数,第二个模板参数和第一个模板参数的类型是没有关系的,可以指定为第一个模板参数类型,也可以指定为其它类型。因此,这不是模板模板参数。
参考博客:https://blog.csdn.net/men_wen/article/details/74033327