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

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

《C++ Templates, the Complete Guide》  

2012-03-18 09:30:23|  分类: lang_c/c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

很2B地又翻了一次 the Complete Guide。看到第三部分,实在不想再看下去,放弃、放弃。

跳过第二部分 Template in Depth,太文艺了,不要看。


class template

template<typename T>
class MyFoo { … }


class template specialization(特化)

template<>
class MyFoo<std::string> { … }


class template partial specialization(偏特化)

template <typename T1, typename T2>
class MyClass { … }

template <typename T>         // typeof(T1) == typeof(T2)
class MyClass<T,T> { … }

template <typename T>         // 第二个参数为 int
class MyClass<T, int> { … }

template <typename T1, typename T2>     // 参数为指针
class MyClass<T1*, T2*> { … }


nontype class template parameters

template <typename T, int MAXSIZE>
class Stack {
private:
  T elems[MAXSIZE];
  …
};


nontype function template paramters

template <typename T, int VAL>
T addValue(T const& x)
{
  return x + VAL;
}

std::transform(source.begin(), source.end(), dest.begin(), addValue<int,5>);


template template parameter

template <typename T, typename CONT = std::vector<T>>
class MyClass
{
  CONT container_;
  …
};

这个声明起来要 MyClass<int, std::deque<int>>,不方便,更直观的应该是 MyClass<int, std::deque>,下面则可做到

template <typename T, template <typename ELEM> class CONT = std::vector>
class MyClass
{
  CONT<T> container_;
  ...
};

对于 STL容器,上面那样写是不行的,要如下,把 allocator 那个参数也搞进去

template <typename T,
          template <typename E, typename ALLOC = std::allocator<E> > class CONT = std::vector>
class MyClass
{
private:
  CONT<T> container_;

public:
  void push(const T& elem)
  {
    container_.push_back(elem);
  }
};

int main()
{
  MyClass<int, std::deque> vList;
  vList.push(10);
  return 0;
}


static polymorph (静态多态)

#include <iostream>

template <typename Obj>
void draw(const Obj& o)
{
  o.drawMe();
}

class Foo
{
public:
  void drawMe() const { std::cout << "Foo" << std::endl; }
};

class Bar
{
public:
  void drawMe() const { std::cout << "Bar" << std::endl; }
};

int main()
{
  Foo f;
  Bar b;
  draw(f);
  draw(b);
  return 0;
}

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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