注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++模板之Nontype Function Template Parameters(非类型函数模板参数)与预设模板自变量  

2013-05-02 21:22:47|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++模板之Nontype   Function   Template  Parameters(非类型函数模板参数)与预设模板自变量

对模板不很熟悉,一直对这个“非类型模板参数”不是太明白,这两天看书,加上找资料,发现对这个的理解还基本是明白了。

在使用模板的时候儿,一般都是如下类型:

template <typename T, typename T1>

T addValue(T const& x,T1 y)

{

 Cout<<y<<endl;

return  x;

}

 

template <typename T1, typename T2>

class MyClass {

...

};

一般在使用的时候儿,大家可能会用具体的类型来实例化他们:

Int x;bool y;

addValue(x,y)

MyClass<int,std::string> t;

而有的时候儿你可能会这样写:

template <typename T , int MAXSIZE>

class Stack {

...

};

还可以指定模板参数的默认值:

template <typename T = int, int MAXSIZE = 100>

class Stack {

...

};

那个MAXSIZE其实就是非类型参数.再举一个“C++模板”P32的例子:

template <typename T, int VAL>

T addValue(T const& x)

{

return x + VAL;

}

这样的话,你就可以直接操作一个固定的值来达到某种目的。还有一个类似的例子:

std::transform (source.begin(), source.end(),  // 来源端起止位置

dest.begin(), // 目的端起始位置

addValue<int,5>); // 实际操作

最后一个自变量将  function template   addValue() 实例化了,使其操作成为「将5加进一个int   值中」。算法transform() 会对source 中的所有元素调用这个具现体(函数),然后把结果传入  dest 中。

 

[注意上述例子带来的一个问题:addValue<int,5> 是个  function template  实体(instance ),而我们知道,所谓「function template s  实体」被认为是命名了 一组重载函数集,即使该函数集内可能只有一个函数。根据目前标准,编译器无法借助「重载函数集」来进行  template parameter 的推导。因此你不得不把  function template argument  强制转型为精确类型:

// (2)

std::transform (source.begin(), source.end(),  // 来源端起止位置

dest.begin(), // 目的端起始位置

(int(*)(int const*)) addValue<int,5>); // 操作

说明:将addValue转成一个返回值为int的参数为int const*的函数指针。

 C++    Standard    中 已 有一 个提案 要 求修正这种行为 ,使你不必 在这种场合强制 转型(请参 考 [CoreIssue115])。在尚未获得修正之前,为保证程序的可移植性,你还是得像上面那么做。]

其实上面说一大堆就是说addValue是一个函数,是一个显式指明了模板参数的类型。这个和C#中的一样,大家平时都是隐式的使用。所以对这个可能有些不适应。也就是说调用函数可以这样调用 :

addValue<int,double>(a,b);

说到这里就不得不说一下“预设模板自变量”:

template <typename T, typename CONT = std::vector<T> >

class Stack

{};

如果只一个参数:

Stack<double> dblStack;那么内部的管理就使用vector

否则:

Stack<double,std::deque<double> > dblStack;

就会使用deque来管理具体的数据。

其实细一看发现和函数参数的默认值是基本类似的。


再回到非类型模板参数,使用这种方式,还是有不少的限制的,一般只能是整型,或者enum或者指向外部链接的指针,而不能是浮点或者类类型,字符串如果不处理成外部链接也是无法使用的,具体的看侯捷的C++模板中的非类型模板参数即第四章.

学以致用,致胜。

  评论这张
 
阅读(849)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017