当前位置: 首页 > news >正文

C++模板的模板参数(五)

1.模板的模板参数

在C++中,模板的模板参数(Template Template Parameters)是一种特殊的模板参数,允许我们将另一个模板作为模板参数传递给一个模板。这种技术可以用于实现更灵活和通用的模板设计。

模板的模板参数使用两个 “template” 关键字来指示,其中第一个 “template” 用于声明模板参数,第二个 “template” 用于声明模板模板参数本身。通常情况下,还需指定模板模板参数的参数列表。

先观察一下示例:

template <typename T, typename CONT = std::vector<T>>
class Stack 
{
private:CONT elems;public:void push(T const&);void pop();T top() const;bool empty() const{return elems.empty();}    int32_t getElemsSize() const{        return elems.size();}
};

上面示例在使用的过程中,要不使用默认值,要不需要两次指定元素类型

Stack<int> int_stack;   //使用默认值Stack<double, std::deque<double>> double_stack;	   //指定两次元素类型double

然而,借助于模板的模板参数,可以指定容器的类型而不需要指定所含元素的类型,这样在声明的时候可以使用Stack<double, std::deque> double_stack

2.实现方法

为了实现上述的特性,需要将第2个模板参数指定为模板的模板参数,那么Stack的声明如下:

template <typename T, template<typename ELEM> class CONT = std::vector >class Stack 
{
private:CONT elems;public:void push(T const&);void pop();T top() const;bool empty() const{return elems.empty();}    int32_t getElemsSize() const{        return elems.size();}
};

上面示例需要注意两点

  • template <typename T, template<typename ELEM> class CONT = std::vector >必须使用class,CONT是为了定义一个类,只能使用class
  • 上面的示例无法使用,因为std::vector和模板的模板参数CONT不匹配,这里需要补充缺省值内存分配器allocator;

最终示例:

/** @brief: class complates* @complie: g++ -g *.cc -o d -std=c++11* @autor: your name* @date: 2023/08/27*/#include <iostream>
#include <vector>
#include <deque>template <typename T, template <typename ELEM, typename ALLOC = std::allocator<ELEM> > class CONT = std::vector>
class Stack 
{
private:CONT<T> elems;public:void push(T const&);void pop();T top() const;bool empty() const{return elems.empty();}    int32_t getElemsSize() const{        return elems.size();}
};template <typename T, template <typename, typename> class CONT>
void Stack<T, CONT>::push(T const& elem)
{elems.push_back(elem);
}template <typename T, template <typename, typename> class CONT>
void Stack<T, CONT>::pop()
{if(elems.empty()) {throw std::out_of_range("empty stack");}elems.pop_back();
}template <typename T, template <typename, typename> class CONT>
T Stack<T, CONT>::top() const
{if(elems.empty()) {throw std::out_of_range("empty stack");}return elems.back();
}int main(int argc, char* argv[])
{//使用默认值Stack<int> int_stack;int_stack.push(10);int_stack.push(20);int_stack.push(30);std::cout<<int_stack.top()<<std::endl;//赋值类型Stack<double, std::deque> double_stack;	double_stack.push(10.11);double_stack.push(20.22);double_stack.push(30.33);std::cout<<double_stack.top()<<std::endl;return 0;
}

3.特别说明

template <typename T, template <typename ELEM, typename ALLOC = std::allocator<ELEM> > class CONT = std::vector>中第二个参数其实本身就是一个类模板,可以将其摘出来进行进一步的分析;

#include <iostream>
#include <vector>
#include <deque>template <typename ELEM, typename ALLOC = std::allocator<ELEM> > 
class CONT
{
public:void printInfo(){std::cout<<"print info"<<std::endl;}
};int main(int argc, char* argv[])
{CONT<int> C;C.printInfo();return 0;
}

template <typename T, template <typename ELEM, typename ALLOC = std::allocator<ELEM> > class CONT = std::vector> 中,CONT接受的类型其实就是T,当然换成其他的类型也可以;

http://www.lryc.cn/news/143526.html

相关文章:

  • 基于jeecg-boot的flowable流程加签功能实现
  • day-03 基于TCP的服务器端/客户端
  • 匿名对象和一般对象的区别
  • [MyBatis系列⑥]注解开发
  • [ACL2023] Exploring Lottery Prompts for Pre-trained Language Models
  • 【Python编程】将同一种图片分类到同一文件夹下,并且将其分类的路径信息写成txt文件进行保存
  • 单例模式的相关知识
  • vue问题相关记录
  • skywalking服务部署
  • 【uni-app】压缩图片并添加水印
  • 《每天十分钟》-红宝书第4版-变量、作用域与内存
  • NFTScan | 08.21~08.27 NFT 市场热点汇总
  • 【Java 中级】一文精通 Spring MVC - 数据验证(七)
  • css奇数偶数选择器
  • 【算法】双指针求解盛最多水的容器
  • 浅析SAS协议:设备接入与探测
  • RISC-V IOPMP实际用例-Andes SoC‘s Rapid-k模型
  • 【高阶数据结构】哈希表详解
  • C#与西门子PLC1500的ModbusTcp服务器通信4--搭建ModbusTcp客户端
  • 性能调优篇 二、Jvm监控及诊断工具-命令行篇
  • Fooocus启动时modules报错的解决方法
  • RSA私钥解密操作
  • 数据库基本知识
  • 使用Redis统计网站的UV/DAU
  • 【python】报错:ImportError: DLL load failed: 找不到指定的模块 的详细解决办法
  • SemrushBot蜘蛛爬虫屏蔽方式
  • 6 ssh面密登录
  • 基于微信小程序的汽车租赁系统的设计与实现ljx7y
  • 优化学习体验的在线考试系统
  • 1267. 统计参与通信的服务器