C++模板

1、类模板

  • 示例代码
template<typename T>
class complex {
  complex(T r = 0, T i = 0)
    : re(r), im(i) {}
  complex& operator+= (const complex&);
  T real () const { return re;}
  T imag () const { return im;}
private:
  T re, im;
};
complex<double> c1(1,1, 2.0);
complex<int> c2(2,5);

2、 函数模板

  • 示例代码
template <typename T>
const T& min(const T&a, const T&b) {
  return a > b ? b : a;
};

3、成员模板

  • 示例代码
 template<typename T1, typename T2>
 struct pair {
  typedef T1 first_type;
  typedef T2 second_type;
   
  T1 first;
  T2 second;
  
  pair() : first(T1()), second(T2()) {}
  pair(const T1& a, const T2& b)
    : first(a), second(b) {} 

  // 
  template<typename U1, typename U2>
  pair(const pair<U1, U2> &p)
    : first(p.first), second(p.second) {}
};

pair<Derived1, Derived2> p;
//利用成员模板的构造函数,将子类赋值到父类中(父类可以向下转型)
pair<Base1, Base2> p2(p);
 

4、模板特化

  • 示例代码
template <typename Key>
struct hash {};

// 参数特化模板
template<>
struct hash<char> {
  size_t operator() (char x) const { return x; }
};

template<>
struct hash<int> {
 size_t operator() (int x) const {reuturn x; }
};

5、 模板的偏特化

  • 个数的偏特化
template<typename T, typename Alloc=...>
class vector {
...
};

// 只绑定其中一个模板参数,且需从左到右依次绑定
template<typename Alloc=...>
class vector<bool, Alloc> {
...
};
  • 范围的偏特化
template <typename T>
class C {
...
};

//偏特化后的版本只接收指针类型参数
template<typename T>
class C<T*> {
...
};

C<string> obj1; // 泛化模板类调用
C<string*> obj2;// 偏特化模板类调用

6、 模板的模板参数

  • 示例代码
template<typename T, template<typename T> class container>
class Sample {
  private: 
    Container<T> c;
  public:
    ...
};
//错误使用,此时容器模板需指定第二默认参数,即分配器
Sample<std::string, list> mylist1;
// 正确用法
template<typename T>
using Lst = std::list<T, allocator<T>>;

Sample<std::string, Lst> mylist2;
  • 以下定义非模板的模板参数
template<class T, class Sequence = deque<T>>
class stack {
  friend bool operator== <> (const stack&, const stack&);
  friend bool operator< <> (const stack&, const stack&);
protected:
  Sequence c;
  ...  
}
stack<int> s1;
stack<int, list<int>> s2; //list<int>传入的为确定的参数,已并非模板

7、参数个数可变模板(variadic templates)

void print() {}

template <typename T, typename... Types>
// 模板参数分为两个package,一个为T类型,一个为可变个数,
void print(const T& firstArg, const Types&... args) {
  std::cout<<firstArg<<std::endl;
  std::cout<<"剩余参数个数: "<<sizeof...(args)<<std::endl;
  //利用递归关系调用,直至调用空参数类型
  print(args...);
}

print(7.5,"hello", bitset<16>(377),42);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值