A STL é a biblioteca padrão de templates que descreve container,
iteradores, algoritmos e functores de maneira genérica através de templates.
Um template de função são funções especiais que podem operar com tipos
genéricos permitindo a criação de função
template cuja funcionalidade pode ser adaptada para 
mais de um tipo ou classe sem
a repetição do código completo para cada tipo.
Um template de função é o corpo de uma função que definida pela
palavra reservada template. Um template de função ainda não é uma
função.
Uma função template é uma instância de um template de função que é
gerada em tempo de execução tempo de compilação quando a função é chamada.
Um template de função pode ser definido da seguinte maneira:
template
template
Considere o seguinte exemplo:
/*
Autor: Wladimir Araújo Tavares
*/
#include  < iostream <
#include  < stdlib.h <
#include  < vector <
using namespace std;
template <typename T> 
T GetMax(T a, T b){
      T
result;
      if(a>b)
result =a;
      else
result = b;
      return
result;
}
int main(){
            cout <<
GetMax(2,3) << endl; //int
            cout <<
GetMax(2.0f,3.0f) << endl; //float
            cout <<
GetMax(2L, 1L) << endl; //long int
            cout <<
GetMax(2u, 1u) << endl; //unsigned int
            cout <<
GetMax(2ul, 1ul) << endl; // unsigned long int
            cout <<
GetMax(2.0L,3.0L) << endl; //long double
            cout <<
GetMax(2,2L) << endl;
            system("PAUSE");
  return 0;
}
Observe que essa mesma função é instanciada 5
vezes, mas na última ocorre o seguinte  erro:
no matching
function for call to `GetMax(int, long int)'
Se
você quiser não gerar em tempo de execução a instancianção da função, você pode
informa previamente ao compilador é o tipo da função template e utilizar todos os benefícios (malefícios) da
tipificação fraca do C/C++ da seguinte maneira:
cout << GetMax
 (2,2L) << endl; 
Você pode trabalhar com
vetores e chamar o constructor do tipo da seguinte maneira:
template < typename T>
T sum_vector( vector  v  ){ 
      T
result = T(); 
      typename
vector::iterator it; 
      for(it
= v.begin(); it != v.end(); it++)
            result
= result + (*it);
      return
result;    
}
template < typename T>
T sum_array( T * array, int size ){
      T result = T(); // construtor
do tipo T
      // T = int return 0
      // T = float return 0.0f 
      for(int
i=0;i
            result
+= array[i];
      return
result;
}
int v1 [] = {2,3,4};
cout << sum_array ( v1, 3) << endl;
float v2 [] = {2.5,3.5,4.8};
cout << sum_array ( v2, 3) << endl;
vector <int> v3;
v3.push_back(2);
v3.push_back(3);
v3.push_back(4);
cout << sum_vector ( v3 ) <<
endl;
vector <double> v4;
v4.push_back(2.5);
v4.push_back(3.5);
v4.push_back(4.8);
cout << sum_vector ( v4 ) <<
endl;
Classe
Template Pair
template <class T1, class T2> struct pair
{
  typedef T1 first_type;
  typedef T2
second_type;
  T1 first;
  T2 second;
  pair() :
first(T1()), second(T2()) {}
    pair(const T1& x, const T2& y) :
first(x), second(y) {}
  template <class U, class V>
    pair (const
pair &p) : first(p.first), second(p.second) { }
}
Construtor
1: pair() : first(T1()),
second(T2()) {}
pair
 p1; 
Construtor
2: pair(const T1& x, const T2& y) :
first(x), second(y) {}
pair
 p2(2,3); 
Construtor
3: (const pair &p) : first(p.first), second(p.second)
{ }   
pair
 p3(p1); 
cout
<< p1.first << " " << p1.second << endl;
cout
<< p2.first << " " << p2.second << endl;
cout
<< p3.first << " " << p3.second << endl;
Saída
0 0
2 3
0 0
Um template de classe também pode ter parâmetros que devem
ser inicializados.
const int OnFullArray = 1;
const int OufOfRange 
= 2;
const int NotFoundElem = 4;
template <class T, int SIZE>
class Array{
      private:
            T
array[SIZE];
            int
size;
      public:
      Array()
: size(0) {}
      bool
full(){ return size==SIZE; }
      void
push(T elem){
      const int OnFullArray = 1;
const int OufOfRange 
= 2;
const int NotFoundElem = 4;
template <class T, int SIZE>
class Array{
private:
      T
array[SIZE];
      int
size;
public:
Array() : size(0) {}
      bool
full(){ return size==SIZE; }
      void
push(T elem){
            if(!full()
){
                  array[size++] = elem;
            }else{
                  throw
OnFullArray;
            }
      }
      T get(int pos){
            if(
pos >= SIZE || pos < 0) throw OufOfRange;
            if(
pos >= size ) throw NotFoundElem;
            return
array[pos];
      }
      void print(){
            for(int i=0;i
                  cout << array[i] <<
endl;
      }
};
Array <int, 3> v; 
v.push(2);
v.push(3);
v.push(4);
try{
 
v.push(5);
}catch(int e){
  if(e==OnFullArray){
   cout << "Vetor esta
cheio\n";
  }
 }
v.print();
Um comentário:
"Uma função template é uma instância de um template de função que é gerada em tempo de execução."
Não seria em tempo de compilação?
Postar um comentário