C++模板初阶

简介: C++模板初阶

文章目录

引子

我们以前对于交换两个变量可能会根据其参数类型的不同写不同的函数,但是每个函数除去参数类型之外都是相同的

//交换两个变量
//c语言交换
void swapint(int *a,int *b)
{}
//c++
//c++可以重载
void swap(int & a,int& b)
{}
void swap(double& a,double&b)
{}

因此就造成了很大的冗余没有必要,所以就提出了模板的概念

模板

函数模板模板和印刷术非常像 普通情况下,如,要抄一首诗,1000编,让1000个人来抄,效率很低

我们就可以把诗词刻在一个模具上面,印刷出来1000份,非常的方便

template < class T>

也可以template < class T1,class T2……>

//函数模板
template<class T>//也可以这样template<typename T>,模板参数列表--参数的类型
//也可以定义多个类型
//template<class T1,class T2>
//无论有多少个函数类型,都用他就可以了,自定义类型也可以
void swap(T& a, T& b)//函数参数列表,参数对象,
{
  T x = a;
  a = b;
  b = x;
}
int main()
{
  int a = 0, b = 1;
  double c = 1.1, d = 2.0;
  //我们写函数交换
  swap(a, b);//调用的是实例化之后的函数,模板实例化 swap(d, c);
  char e = ' ', f = 'a';
  //很麻烦都是类似的,这些swap最大的不同再类型上面,只是单纯的类型不一样其他东西都是一样的,
  return 0;
}
template<class t>
t add(const t& a, const t& b)
{
  return a + b;
}
template<class T1,class T2,class T3>
T1 add(const T2& a, const T3& b)
{
  return a + b;
}
int main()
{
  int a = 1, b = 2;
  double c = 1.1, d = 2.3;
  cout << add(a, b) << endl;
  cout << add(c, d) << endl;
  //如果要对于a和d加,不可以直接弄
  //1.强制转
cout<<add((double)a, d)<<endl;//这些都是自己推
//2.显示实例化
cout << add<int>(a, d) << endl;//指定我们要实例化的类型,指定t用int类型
cout << add<double>(a, d) << endl;
cout << add(c, d) << endl;
  return 0;
}

类模板

//类的模板,语法也是类似的
template<class t1>
class Stack
{
private:
  int _top; 
  int _capacity;
  t1 * _a;
public:
  Stack(int capacity = 4)
    :_top(0)
    , _capacity(4)
  {
    _a = new t1[capacity];//对于*a的处理初始化非常方便
  }
  ~Stack()
  {
    delete[] _a;
    _a = nullptr;
  }
  void Push(const t1& m);
};
template<class t1>
void Stack<t1>::Push(const t1& m)//要指定类模板
{
}
int main()
{
  //类模板不支持参数类型的推演,只支持显示实例化的指定
  Stack<int> st1(2);//存int
  Stack <double>st2(2);//存double
  Stack<int*>st3;
  Stack<char>st4;
  st1.Push(1);
  return 0;
}
相关文章
|
14天前
|
编译器 C++
【C++】——初识模板
【C++】——初识模板
28 1
【C++】——初识模板
|
2月前
|
程序员 C++
C++模板元编程入门
【7月更文挑战第9天】C++模板元编程是一项强大而复杂的技术,它允许程序员在编译时进行复杂的计算和操作,从而提高了程序的性能和灵活性。然而,模板元编程的复杂性和抽象性也使其难以掌握和应用。通过本文的介绍,希望能够帮助你初步了解C++模板元编程的基本概念和技术要点,为进一步深入学习和应用打下坚实的基础。在实际开发中,合理运用模板元编程技术,可以极大地提升程序的性能和可维护性。
|
29天前
|
编译器 C++
【C++】模板初级
【C++】模板初级
|
29天前
|
安全 编译器 C++
【C++】模板进阶
【C++】模板进阶
|
21天前
|
并行计算 测试技术 开发工具
【简历模板】c/c++软件工程师
【简历模板】c/c++软件工程师
35 0
|
2月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
47 11
|
2月前
|
编译器 C++ 容器
C++一分钟之-可变模板参数与模板模板参数
【7月更文挑战第21天】C++的模板实现泛型编程,C++11引入可变模板参数和模板模板参数增强其功能。可变模板参数(如`print`函数)用于处理任意数量的参数,需注意展开参数包和递归调用时的处理。模板模板参数(如`printContainer`函数)允许将模板作为参数,需确保模板参数匹配和默认值兼容。这些特性增加灵活性,但正确使用是关键。
38 4
|
2月前
|
Java 编译器 Linux
【c++】模板进阶
本文详细介绍了C++中的模板技术,包括非类型模板参数的概念、如何使用它解决静态栈的问题,以及模板特化,如函数模板特化和类模板特化的过程,以提升代码的灵活性和针对性。同时讨论了模板可能导致的代码膨胀和编译时间增加的问题。
24 2
|
2月前
|
编译器 C语言 C++
【C++】模板初阶(下)
C++的函数模板实例化分为隐式和显式。隐式实例化由编译器根据实参推断类型,如`Add(a1, a2)`,但`Add(a1, d1)`因类型不一致而失败。显式实例化如`Add&lt;double&gt;(a1, d1)`则直接指定类型。模板函数不支持自动类型转换,优先调用非模板函数。类模板类似,用于创建处理多种数据类型的类,如`Vector&lt;T&gt;`。实例化类模板如`Vector&lt;int&gt;`和`Vector&lt;double&gt;`创建具体类型对象。模板使用时,函数模板定义可分头文件和实现文件,但类模板通常全部放头文件以避免链接错误。
|
2月前
|
机器学习/深度学习 算法 编译器
【C++】模板初阶(上)
**C++模板简介** 探索C++泛型编程,通过模板提升代码复用。模板作为泛型编程基础,允许编写类型无关的通用代码。以`Swap`函数为例,传统方式需为每种类型编写单独函数,如`Swap(int&)`、`Swap(double&)`等,造成代码冗余。函数模板解决此问题,如`template&lt;typename T&gt; void Swap(T&, T&)`,编译器根据实参类型推导生成特定函数,减少重复代码,增强可维护性。模板分函数模板和类模板,提供处理不同数据类型但逻辑相似的功能。