如图,c++里为啥template还能这样用啊?为啥template尖括号里有变量?(template<int x,int y>)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如图,c++里为啥template还能这样用啊?为啥template尖括号里有变量?(template<int x,int y>)相关的知识,希望对你有一定的参考价值。
模板有类型模板和非类型模板两种,你举的这种属于非类型模板。类型模板类似于template<class T>,T是一种泛型类型,例如char、int、string或是自定义的类型A。类型模板函数template<class T> void fun(T a),将T实例化为int那么参数a的类型就是int,实例化为A那么参数a的类型就是A。
非类型模板template<int T>同理,只不过它的泛型T不是类型而是int型常量,例如1、3、10。非类型模板的典型应用就是数组长度定义,众所周知int a[N]这种语句中N必须是一个编译期常量否则无法通过编译,要实现定义不同长度的数组,就可以使用template<int T> void foo()double a[T]这样的写法,调用foo时必须传递一个编译期常量如10,如foo<10>(),即可在函数foo中创建一个长度为10的double数组。 参考技术A 模板元编程这种黑科技都有呢,区区一个变量不算什么。
ps你只能用常数
小白学习C++ 教程十五C++ 中的template模板和泛型
@Author:Runsen
template模板在 C++ 中一个简单但非常强大的工具。简单的想法是将数据类型作为参数传递,这样我们就不需要为不同的数据类型编写相同的代码。
C++ 添加了两个新关键字来支持模板:template
和typename
。第二个关键字typename
可以替换为关键字“class
”。
模板可以以两种不同的方式使用。
- 函数模板
- 类模板
泛型
在学习template模板之前,了解一下泛型。在Java中学习过泛型,其实都是差不多的概念。泛型是允许类型(整数、字符串等)作为方法、类和接口的参数的想法。
例如,像数组等这样的对象可以非常有效地使用泛型。
实现了泛型编程的方法来提高代码的效率。通用编程使程序员能够编写适用于所有数据类型的通用算法。如果数据类型是整数、字符串或字符,则无需创建不同的算法。
泛型编程的优点是
- 代码可重用性
- 避免函数重载
- 一旦编写泛型,它可以用于多个cpp
泛型一般和模板结合使用。模板是一个简单但非常强大的 C++ 工具。简单的想法是将数据类型作为参数传递,这样我们就不需要为不同的数据类型编写相同的代码。
#include <iostream>
using namespace std;
// 函数模板
template <typename T>
T myMax(T x, T y)
{
return (x > y) ? x : y;
}
int main()
{
// int
cout << myMax<int>(3, 7) << endl;
// double
cout << myMax<double>(3.0, 7.0) << endl;
// char
cout << myMax<char>('g', 'e') << endl;
return 0;
}
输出:
7
7
G
函数模板
函数模板用于创建一组将相同算法应用于不同数据类型的函数。
#include<iostream>
using namespace std;
template <class A> A addition(A x, A y)
{
return ( x + y );
}
int main()
{
cout<<"Addition1 : "<<addition(4,4)<<endl;
cout<<"Addition2 : "<<addition(4.2,3.6)<<endl;
cout<<"Addition3 : "<<addition(4.0,4.7)<<endl;
return 0;
}
输出:
Addition1 : 8
Addition2 : 7.8
Addition3 : 8.7
如果执行cout<<"Addition3 : "<<addition(4,4.7)<<endl;
,将会报错。
值 4 & 4.7
,它将是不同的整数和浮点数;而泛型函数声明两个参数的数据类型相同。
类模板
与函数模板一样,可以为通用类操作创建类模板。
有时,需要一个对都相同的类实现,只是使用的数据类型不同。
类模板可以轻松地为所有数据类型重用相同的代码。
以下是类模板的语法:
template <class T>
class className
{
... .. ...
public:
T var;
T someOperation(T arg);
... .. ...
};
在上面的声明中,T
是模板参数,它是所用数据类型的占位符。
在类体内部,一个成员变量 var
和成员函数someOperation()
都是类型T。
创建类模板对象,需要在< >
内部定义数据类型。
类名<数据类型> 类对象;
下面使用类模板对两个数字进行加减乘除的程序
#include <iostream>
using namespace std;
template <class T>
class Calculator
{
private:
T num1, num2;
public:
Calculator(T n1, T n2)
{
num1 = n1;
num2 = n2;
}
void displayResult()
{
cout << "Numbers are: " << num1 << " and " << num2 << "." << endl;
cout << "Addition is: " << add() << endl;
cout << "Subtraction is: " << subtract() << endl;
cout << "Product is: " << multiply() << endl;
cout << "Division is: " << divide() << endl;
}
T add() { return num1 + num2; }
T subtract() { return num1 - num2; }
T multiply() { return num1 * num2; }
T divide() { return num1 / num2; }
};
int main()
{
Calculator<int> intCalc(2, 1);
Calculator<float> floatCalc(2.4, 1.2);
cout << "Int results:" << endl;
intCalc.displayResult();
cout << endl << "Float results:" << endl;
floatCalc.displayResult();
return 0;
}
输出如下:
Int results:
Numbers are: 2 and 1.
Addition is: 3
Subtraction is: 1
Product is: 2
Division is: 2
Float results:
Numbers are: 2.4 and 1.2.
Addition is: 3.6
Subtraction is: 1.2
Product is: 2.88
Division is: 2
Code:使用函数模板显示求数组中的最小数。
#include <iostream>
using namespace std;
template <class T, int max>
int arrMin(T arr[], int n)
{
int m = max;
for (int i = 0; i < n; i++)
if (arr[i] < m)
m = arr[i];
return m;
}
int main()
{
int arr1[] = {10, 20, 15, 12};
int n1 = sizeof(arr1)/sizeof(arr1[0]);
char arr2[] = {1, 2, 3};
int n2 = sizeof(arr2)/sizeof(arr2[0]);
cout << arrMin<int, 10000>(arr1, n1) << endl;
cout << arrMin<char, 256>(arr2, n2);
return 0;
}
以上是关于如图,c++里为啥template还能这样用啊?为啥template尖括号里有变量?(template<int x,int y>)的主要内容,如果未能解决你的问题,请参考以下文章
c++模板类的知识,为啥下面程序要用结构体,把T data写在类里面不可以吗?看到好多地方这样写
c++ vector find 如何查找啊?语法是怎么写的?