Ir ao conteúdo
  • Cadastre-se

c++ 11 - sobre templates


Cambalinho

Posts recomendados

porque quando fazemos 1 funçao template, quando a usar-mos, nao nos preocupamos com os argumentos entre '<>', mas em class temos que o fazer?

template < typename T>void foobar (T arg1, T arg2){   // Código relevante aqui, como de praxe.   // A única diferença é que você pode tratar T como se fosse um tipo.}

quando usamos a funçao:

foobar(3,5);//oufoobar("hello","bye");

(a funçao nao faz nada, mas é para mostrar a forma de utilizaçao)

mas nas classes:

template<typename T>class test{   public:       test(T nome)       {       }};//usartest<string> test("joaquim);

volto a perguntar: se com funçoes nao preciso usar '<tipos>', porque o tenho de o fazer com as classes?

Link para o comentário
Compartilhar em outros sites

é porque o construtor em si é uma função,então ele pode ser "templatizado",isso faz com que o escopo onde o argumento é deduzivel só seja visivel dentro do construtor,isso cria mais flexibilidade

 

voce pode usar uma função fatorial se quiser pra ter esse efeito de "dedução de tipo" pra quando for criar um objeto da classe

Link para o comentário
Compartilhar em outros sites

O compilador tenta ser o mais inteligente o possível, isso é o que destaca as linguagens compiladas das linguagens interpretadas.

 

No caso, quando você declara um tipo template na classe, o compilador não tem como saber qual tipo ele será pelo uso, pois não existe uso ainda definido. A classe poderia inferir do construtor? Mas podemos ter N construtores... Nesse caso o compilador não tem como saber qual será o tipo usado pela classe e exige a sua declaração.

 

Quando você declara apenas os métodos template (genérico no C# e Java) o compilador infere o tipo, pois é óbvio para ele devido ao tipo do parametro, cabendo inclusive a diferenciação por tipo e overload de métodos.

 

Tanto é que alguns programadores escrevem classes Wrapper para encapsular classes Template e criá-las com uma chamada (estática?) para utilizar a inferência de tipo.

 

Perceba o exemplo abaixo, use apenas como exemplo, não recomendo ponteiros "pelados"

template<typename T>class Generic{public:	Generic(T xpto)	{	}};class GenericFactory{public:	template<typename T>	static Generic<T>* GetGeneric(T val) { return new Generic <T> { val }; }};

Uso sem especificar o tipo:

auto gInferido = GenericFactory::GetGeneric(5);delete gInferido;

No C++14 poderemos usar auto como retorno do método GetGeneric.

 

Lembre-se do ponto chave, você só precisa especificar o tipo quando o compílador não consegue inferir por você.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...