Exercícios Resolvidos de Templates

Ver Teoria

Enunciado

Considere as seguintes definições de templates das funções x p t o , y p t o e z p t o .

E considere as classes t d a t a , t h o r a r i o e t d i m e n s a o

Indique quais das linhas de código de m a i n abaixo são legais e explique as que não são.

Passo 1

E aí, pessoal?!

Essa é uma questão trabalhosa, mas que vamos fazer com calma e vai dar tudo certo. A chave da questão é perceber como cada um dos tipos genéricos vai se comportar quando uma função é chamada.

Vamos começar analisando os templates.

Vamos começar observando as classes t d a t a , t h o r a r i o e t d i m e n s a o

As três classes são bem similares, e consistem em apenas três atributos inteiros.

São classes sem função real, e tudo que importa pra essa questão é que elas representam tipos diferentes!

Agora vamos analisar as aparições dessas classes na m a i n (). Logo no início são declarados um objeto de cada uma das classes: a do tipo t d a t a , b do tipo t h o r a r i o e c do tipo t d i m e n s ã o .

Passo 2

Vamos analisar o template x p t o

O template de função x p t o usa apenas um tipo genérico chamado T . Ele recebe dois valores do mesmo tipo e retorna como resultado o segundo valor. Ou seja, x p t o recebe e retorna valores todos do mesmo tipo!

Agora vamos analisar as aparições da função x p t o dentro da m a i n .

Esse template de função deve receber dois argumentos e um retorno do mesmo tipo. Então caso haja alguma diferença de tipo, haverá um erro.

Então podemos apontar um erro na linha 08 onde o retorno b é diferente do tipo do argumento a .

E um outro erro na linha 09 onde os três tipos envolvidos são diferentes.

Passo 3

Em seguida, vamos analisar y p t o .

O template de função y p t o utiliza dois tipos genéricos T e U . Essa função recebe dois valores, um de cada tipo, e retorna o segundo valor recebido. O importante é que na função y p t o o retorno é do mesmo tipo que o segundo argumento.

Agora vamos ver y p t o dentro da m a i n

Aqui o importante é que o tipo do retorno seja igual ao tipo do segundo argumento.

E por isso temos um erro na linha 13 onde os tipos b e a são diferentes.

E na linha 15 onde c e b são de tipos diferentes.

Passo 4

E por fim, a o template de função z p t o .

O template de função z p t o utiliza três tipos genéricos T , U e V . Os valores recebidos são de tipos diferentes e antes de retornar, a função z p t o converte o tipo de y para V . Ou seja, a função z p t o pode receber dois argumentos de tipos diferentes, e retornar um valor de um terceiro tipo.

Porém, tem um detalhe. O prefixo de z p t o declara três tipos genéricos T , U e V . O tipo real de T será definido quando for passado o primeiro argumento x . O tipo de U será definido de acordo com o segundo argumento y . Mas em que momento o tipo real de V está sendo definido?

O tipo de V não é definido em nenhum momento! Então para usar esse template, a única forma é definindo os tipos de T , U e V de forma explicita usando as chaves: < t i p o 1 ,   t i p o 2 ,   t i p o 3 >

Em nenhum momento o tipo verdadeiro de V está sendo definido de forma explicita! Então todos os usos de z p t o mostrados no código estão errados.

Passo 5

Para corrigir esse código, primeiro vamos precisar remover as linhas 08 e 09

Depois, devemos remover as linhas 13 e 15.

E nas linhas 19 a 22 devemos adicionar explicitamente os tipos que estão sendo usados no template:

E é isso pessoal! Até a próxima!

Resposta