博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
玩转c++模板模板参数
阅读量:4091 次
发布时间:2019-05-25

本文共 3519 字,大约阅读时间需要 11 分钟。

#include 
#include
#include
#include
using namespace std;#if 1// CASE1:不使用模版模版参数,明确指定容器的类型,比如STL库的stack实现,见下:template
> class Stack1 {
private: CONT elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const {
// return whether the stack is empty return elems.empty(); } };int main(int argc, char const *argv[]){
Stack1
> s; cout << boolalpha <
<< endl; return 0;}#elif 0// CASE2:使用alias template的语法(c++11)传参// 推导过程:其实E只是占位符号,会替换alias template(即using语法)中声明的原型。此处可以省略E,使用前面已出现的T。(具体参见case3)template
class CONT = std::deque>class Stack2{ private: CONT
elems; // elementspublic: void push(T const &); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};template
using Vec = vector
>;int main(int argc, char const *argv[]){ Stack2
s; cout << boolalpha << s.empty() << endl; return 0;}#elif 0// CASE3:省略E,使用之前出现过的T去做推导template
class CONT = std::deque>class Stack3{ private: CONT
elems; // elementspublic: void push(T const &); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};template
using Vec = vector
>;int main(int argc, char const *argv[]){ cout << "case 3" << endl; Stack3
s; cout << boolalpha << s.empty() << endl; return 0;}#elif 0// CASE4// 同理,可以不写using语法,直接在模板类中写全,此方法适用于c++98(但是需要注意两个>>在一起的时候需要加空格,不然报错)template
> class CONT>class Stack4{ private: CONT
> elems; // 基于内存池的分配器public: void push(T const &); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};int main(int argc, char const *argv[]){ cout << "case 4" << endl; Stack4
s; cout << boolalpha << s.empty() << endl; return 0;}#elif 0// CASE5:省略占位符E,使用之前出现过的T// 也可以省略一个占位符号E,注意:如果有默认=出现的地方不能省略类型别名,比如“typename Alloc = allocator
”中的T// 要省略T就得替换为前置出现的别名(因为省略类型之后变为了模板类),// 比如“typename Alloc = allocator
”变为“template
class Alloc = alloctor”,详见case6template
> class CONT>class Stack5{ private: CONT
elems; // elementspublic: void push(T const &); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};int main(int argc, char const *argv[]){ cout << "case 5" << endl; Stack5
s; cout << boolalpha << s.empty() << endl; return 0;}#elif 0// CASE6:同理,可以省略M,使用之前的T,如case7// CASE6\CASE7 可以通过编译,但无测试用例,太复杂。template
class Alloc = allocator> class CONT>class Stack6{ private: CONT
elems; // elementspublic: void push(T const &); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};int main(int argc, char const *argv[]){ //cout << "case 6" << endl; // 太复杂,不建议使用,无测试成功的用例 return 0;}#elif 0// CASE7:同理,可以省略M,使用之前的T,如case7// template
class Alloc = allocator> class CONT>class Stack7{ private: CONT
elems; // elementspublic: void push(T const &); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); }};int main(int argc, char const *argv[]){ // 太复杂,不建议使用,无测试成功的用例 return 0;}#endif

转载地址:http://mecii.baihongyu.com/

你可能感兴趣的文章
【C#】如何实现一个迭代器
查看>>
【Unity】Destroy和DestroyImmediate的区别
查看>>
【Lua】Mac系统下配置SublimeText的Lua编译环境
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
【UGUI/NGUI】一键换Text/Label字体
查看>>
【C#】身份证本地验证
查看>>
【Unity】坑爹的Bug
查看>>
【算法】求数组中某两个数的和为目标值
查看>>
如何高效学习动态规划?
查看>>
动态规划法(六)鸡蛋掉落问题(一)
查看>>
LeetCode 887.鸡蛋掉落(C++)
查看>>
Dijkstra‘s algorithm (C++)
查看>>
奇异值分解(SVD)的原理详解及推导
查看>>
算法数据结构 思维导图学习系列(1)- 数据结构 8种数据结构 数组(Array)链表(Linked List)队列(Queue)栈(Stack)树(Tree)散列表(Hash)堆(Heap)图
查看>>
求LCA最近公共祖先的离线Tarjan算法_C++
查看>>
Leetcode 834. 树中距离之和 C++
查看>>
【机器学习】机器学习系统SysML 阅读表
查看>>
最小费用最大流 修改的dijkstra + Ford-Fulksonff算法
查看>>