English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ Template

Neste artigo, você aprenderá C ++O template. Você aprenderá como usar as funcionalidades do template para programação genérica.

Template é C ++A potente funcionalidade, que permite escrever programas genéricos. Em resumo, você pode usar templates para criar uma função ou uma classe que manipule diferentes tipos de dados.

O template é frequentemente usado em grandes bases de código, com o objetivo de implementar a reutilização do código e a flexibilidade do programa.

O conceito de template pode ser usado de duas maneiras diferentes:

  • Modelo de função

  • Modelo de classe

Modelo de função

O modelo de função funciona de maneira semelhante à função comumFunçãoSimilar, mas com uma diferença.

Um único modelo de função pode manipular diferentes tipos de dados em uma vez, mas uma função comum pode manipular apenas um grupo de tipos de dados.

Normalmente, se precisar executar a mesma operação em dois ou mais tipos de dados, você pode usar sobrecarga de função para criar duas funções com a declaração de função necessária.

Mas, a melhor maneira é usar o modelo de função, pois você pode usar menos código para executar a mesma tarefa.

Como declarar um modelo de função?

O modelo de função começa com a palavra-chave template, seguido por os parâmetros do template dentro de <> e, em seguida, a declaração da função.

template	<class	T>
T someFunction(T arg)
{
   ...	...	...
}

No código acima, T é um parâmetro de template que aceita diferentes tipos de dados (como int, float, etc.), enquantoclassé uma palavra-chave.

No exemplo acima, você também pode usar a palavra-chave typename em vez de class.

Quando passar um parâmetro do tipo de dados para someFunction(), o compilador gera uma nova versão de someFunction() para o tipo de dados dado.

Exemplo1:查找最大值的函数模板

O programa usa a função template para exibir o maior dos dois números.

//Se passar dois caracteres para o template da função, exibe o caractere com o valor ASCII maior.
#include	<iostream>
using	namespace	std;
// função template
template	<class	T>
T Large(T n1, T n2)
{
	return (n1 > n2) ? n1 : n2;
}
int main()
{
	int	i1,	i2;
	float	f1,	f2;
	char	c1,	c2;
	cout << "Insira dois inteiros:\n";
	cin >> i1 >> i2;
	cout << Large(i1,	i2) << "  é maior." << endl;
	cout << "\nInsira dois números de ponto flutuante:\n";
	cin >> f1 >> f2;
	cout << Large(f1,	f2) << "  é maior." << endl;
	cout << "\nInsira dois caracteres:\n";
	cin >> c1 >> c2;
	cout << Large(c1,	c2) << "  tem o valor ASCII maior.";
	return 0;
}

Output result

Insira dois inteiros:
5
10
10 é maior.
Insira dois números de ponto flutuante:
12.4
10.2
12.4 é maior.
Insira dois caracteres:
z
Z
z tem o valor ASCII maior.

No programa acima, foi definida uma função template Large(), que aceita dois parâmetros do tipo de dados T n1e n2。T representa que este parâmetro pode ser qualquer tipo de dados.

A função Large() usa simplesOperação condicionalRetorna o maior dos dois parâmetros.

Dentro da função main(), foram declaradas três variáveis de diferentes tipos de dados: int, float e char. Em seguida, essas variáveis são passadas para a função template Large() como função comum.

No tempo de execução, ao passar um inteiro para a função template, o compilador sabe que deve gerar uma função Large() para aceitar parâmetros do tipo int e é assim que faz.

Da mesma forma, quando passamos dados de ponto flutuante e char, ele sabe o tipo de dados do argumento e gera a função Large() correspondente.

Desta forma, você pode substituir três funções comuns idênticas com apenas uma função template, tornando seu código mais conciso e fácil de manter.

Exemplo2:使用函数模板交换数据

O programa usa a função template para trocar dados.

#include	<iostream>
using	namespace	std;
template <typename T>
void Swap(T &n1, T &n2)
{
	T temp;
	temp = n1;
	n1 = n2;
	n2 =	temp;
}
int main()
{
	int	i1 = 1,	i2 = 2;
	float	f1 = 1.1,	f2 = 2.2;
	char	c1 =	a,	c2 =	b;
	cout	<<	"Antes de passar dados para o modelo de função.\n"
	cout	<<	i1 ="	<<	i1 <<<
	i2 ="	<<	i2;
	cout	<<	"\nf1 ="	<<	f1 <<<
	f2 ="	<<	f2;
	cout	<<	"\nc1 ="	<<	c1 <<<

c2 ="	<<	c2;
	Swap(i1,	i2);
	Swap(f1,	f2);
	Swap(c1,	c2);
        cout	<<	"\n\nPassar dados para o modelo de função após passar dados para o modelo de função.\n"
	cout	<<	i1 ="	<<	i1 <<<
	i2 ="	<<	i2;
	cout	<<	"\nf1 ="	<<	f1 <<<
	f2 ="	<<	f2;
	cout	<<	"\nc1 ="	<<	c1 <<<

c2 ="	<<	c2;
	return 0;
}

Output result

Antes de passar dados para o modelo de função.
i1 = 1
i2 = 2
f1 = 1.1
f2 = 2.2
c1 =	a
c2 =	b
Passar dados para o modelo de função após passar dados para o modelo de função.
i1 = 2
i2 = 1
f1 = 2.2
f2 = 1.1
c1 =	b
c2 =	a

Neste programa, não chamamos a função passando valores, masPor referênciaRealizar chamadas.

A função de modelo Swap() aceita dois parâmetros e os troca por referência.

Modelo de classe

Como os modelos de função, você também pode criar modelos de classe para operações comuns de classe.

Às vezes, você precisa de uma implementação de classe para todos os tipos de classe, apenas os tipos de dados usados são diferentes.

Normalmente, você precisa criar uma classe diferente para cada tipo de dados, ou criar diferentes variáveis de membro e funções dentro de uma classe.

Isso aumentará muito o código semelhante e será difícil de manter.

Mas, o modelo de classe facilita o uso repetido do mesmo código para todos os tipos de dados.

Como declarar um modelo de classe?

template	<class	T>
class	className
{
   ...	...	...
public:
   T	var;
   T	someOperation(T	arg);
   ...	...	...
};

Nas declarações acima, T é o parâmetro de modelo, que é um marcador de posição para o tipo de dados usado.

Dentro da classe, as variáveis de membro var e a função de membro someOperation() são do tipo T.

Como criar um objeto de modelo de classe?

Para criar um objeto de modelo de classe, é necessário definir o tipo de dados dentro dos < > ao criar.

className<dataType>	classObject;

Por exemplo:

className<int>	classObject;
className<float>	classObject;
className<string>	classObject;

Exemplo3:使用类模板的简单计算器

O programa usa o modelo de classe para realizar operações de adição, subtração, multiplicação e divisão de dois números

#include	<iostream>
using	namespace	std;
template	<class	T>
class	Calculator
{
private:
	T		num1,		num2;
public:
	Calculator(T n)1, 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;
}

Output result

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

In the above program, a class template Calculator is declared.

The class contains two private members of type T: num1and num2and the constructor used to initialize the members.

It also contains public member functions to calculate the addition, subtraction, multiplication, and division of numbers to return the value of the user-defined data type. Similarly, the function displayResult() outputs the final result to the screen.

No main() function creates two different Calculator objects for data types intCalc and floatCalc: int and float. Initialize the value using the constructor.

Atenção, usamos <int> e <float> ao criar objetos. Isso informa ao compilador o tipo de dados a ser usado para a criação da classe.

Isso criará uma definição de classe para int e float, respectivamente, e usá-las accordingly.

Então, os dois objetos displayResult() são chamados,

Então, chame os dois objetos displayResult() que executam operações de calculadora e mostram a saída.