C++ 模板模板参数

转自https://blog.csdn.net/men_wen/article/details/74033327 

模板参数就是模板的参数,我们一般指定为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;
1
如果编译就会报错。我们分析一波:

将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传入进入,就可以编译通过。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值