预设模板自变量

原创 2017年01月03日 17:28:06

一、预设模板自变量的示例代码

你可以针对  class templates 定义其  template parameters 的默认值 , 这称为  default template arguments (预设模板自变量)。预设自变量值甚至可以引用前一步声明的   template parameters。例如在前面博客中提到的class Stack<>  中,你可以把「用来容纳元素」的容器类型定义为第二个template parameter,并使用std::vector<>  作为其默认值: 


#include <vector> 
#include <stdexcept> 
 
template <typename T, typename CONT = std::vector<T> > 
class Stack { 
private: 
CONT elems; //  元素 


public: 
void push(T const&); // push 元素

 
void pop(); // pop 元素 


T top() const; //  传回  stack 的顶端元素 


bool empty() const { // stack 是否为空 
return elems.empty(); 

}; 
 
template <typename T, typename CONT> 
void Stack<T,CONT>::push (T const& elem) { 
elems.push_back(elem);   //  追加元素 

 
template <typename T, typename CONT> 
void Stack<T,CONT>::pop() { 
if (elems.empty()) { 
throw std::out_of_range("Stack<>::pop(): empty stack"); 

elems.pop_back(); //  移除最后一个元素 

 
template <typename T, typename CONT> 
T Stack<T,CONT>::top() const { 
if (elems.empty()) { 
throw std::out_of_range("Stack<>::top(): empty stack"); 

return elems.back(); //  传回最后一个元素的拷贝 


二、使用预设模板自变量

你可以像面对「单一template parameter」版本那样地使用这个新版stack。这时如果你只传递一个自变量表示元素类型,stack会使用预设的vector来管理其内部元素:

 
template <typename T, typename CONT = std::vector<T> > 
class Stack { 
private: 
CONT elems; //  元素  
... 
}; 
 
当你在程序中声明一个Stack  object时,也可以明确指定元素容器的类型: 


#include <iostream> 
#include <deque> 
#include <cstdlib> 
#include "stack3.hpp" 
 
int main() { 

try { 
// stack of ints 
Stack<int> intStack; 
 
// stack of doubles,其内部使用  std::deque<>  来管理元素 
Stack<double,std::deque<double> > dblStack; 
//注:千万不要声明为  Stack<double, std::deque<int> >, 
//  这是自己砸自己的脚,编译器无法为你做些什么。 
 
//  操控  int stack 
intStack.push(7); 
std::cout << intStack.top() << std::endl; 
intStack.pop(); 
 
//  操控  double stack 
dblStack.push(42.42); 
std::cout << dblStack.top() << std::endl; 
dblStack.pop(); 
dblStack.pop(); 


} catch (std::exception const& ex) { 
std::cerr << "Exception: " << ex.what() << std::endl; 
return EXIT_FAILURE; //  以错误状态码离开程序 


那么,只要像下面这样做: 
Stack<double,std::deque<double> > 
你就声明了一个  double  stack,其内部以  std::deque<>  来管理元素。
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

unity3D游戏开发学习之使用perfab(预设)创建很多导弹并发射

unity中,perfab是一个很重要的知识点,它是可重复利用的Game Object。这使我联想到cocos2dx中的CCSpriteBatchNode批次渲染可以大大提高渲染效率。同样,unity...

【用Python学习Caffe】6. 权重预设、预训练及微调

6. 权重预设、预训练及微调通过上一节,我们将得到solver文件,得到该文件后,进行网络的训练及测试将变得非常简单。 在通过solver = caffe.SGDSolver(solver_prot...
  • tostq
  • tostq
  • 2017年06月22日 22:19
  • 977

Launcher预设Widget

如果想在Launcher初始化时在Workspace中显示自定义或者网上下载的widget来美化我们的产品,我们需要获取Widget的ComponentName信息,主要是包括包名和类名。如果是别人写...

C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)

C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)                //大家在做报表或查询的时候都会有给用户预设一些可选的日期范围(如上图)          ...

Unity中预设体的创建(mac机)

Perfab可以理解为是一个游戏对象及其组件的集合,目的是使游戏对象及资源能够被重复使用。通过预设体来创建对象的过程可以理解为实例化。  预设体的创建过程如下: 1、打开菜单栏中的Assets--...

Launcher2的桌面预设【1】

1. 如何让系统以动态桌面的方式启动? 修改位置在frameworks/base/core/res/res/values目录找到Config.xml文件,找到下面这一行 null   ...

Totem Movie Player是一套在類Unix操作系統上運行的多媒體播放器,也是Ubuntu系統的預設影片播放器

Totem Movie Player是一套在類Unix操作系統上運行的多媒體播放器,也是Ubuntu系統的預設影片播放器。Totem依照其內建播放引擎的不同可分為兩個版本,Ubuntu內建的版本建基於...

Unity界面、地形和光源、材质、预设体

Unity界面分为: Project(工程视图)、Scene(场景视图)、Game(游戏视图)、Hierarchy(层级视图)、Inspector(属性视图)、Console(调试窗口) ...

Unity3D: 脚本控制动态加载预设物体

在使用Unity 中,动态加载预制体是比较常见的。这里简单介绍一下,加载的几个步骤及过程。用代码控制 一个预设物体在场景中显示,一般需要三个步骤: 1.预设体 资源加载 在 Assets 目录下 ...

android+unity3d的Prefabs(预设)与Instantiate(实例化)

本篇不是我写的,感觉不错所以拷贝来了,呵呵呵,原创的链接:http://bbs.9ria.com/thread-97976-1-1.html  解释:Prefabs(预设)是一种资源类型,可被重复使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:预设模板自变量
举报原因:
原因补充:

(最多只允许输入30个字)