Tipos e templates

5 views
Skip to first unread message

Murilo Adriano Vasconcelos

unread,
Oct 10, 2009, 4:06:30 PM10/10/09
to ccppb...@googlegroups.com
Olá pessoal, gostaria de saber se é possível fazer algo como:

template<class T, unsigned R, unsigned C>
class myClass
{
        public:
                //tipo do objeto atual
                typedef myClass<T,R,C> myClass_t;
};

myClass<int, 1, 1> teste;

teste::myClass_t teste2; //isso aqui


Quero dizer, alguma maneira de eu passar o tipo do objeto template pelo próprio objeto.
É óbvio que o exemplo acima está errado mas gostaria de saber como fazer algo parecido.
Obrigado.

--
Murilo Adriano Vasconcelos
Ciência da Computação INF-UFG
Universidade Federal de Goiás

Thiago A.

unread,
Oct 10, 2009, 5:05:58 PM10/10/09
to ccppbrasil
Se você fizer:

typedef myClass<int, 1, 1> teste;
teste::myClass_t a;

estará correto.



On 10 out, 17:06, Murilo Adriano Vasconcelos <murilo...@gmail.com>
wrote:

Rodrigo (skhaz)

unread,
Oct 10, 2009, 5:08:15 PM10/10/09
to ccppb...@googlegroups.com
acho que o correto seria


 typedef typename myClass<T,R,C> myClass_t;

2009/10/10 Thiago A. <thiago...@gmail.com>

Felipe Magno de Almeida

unread,
Oct 10, 2009, 6:02:04 PM10/10/09
to CcppBrasil
------- Original message -------
> From: Rodrigo (skhaz) <rodrigo...@gmail.com>
> To: ccppb...@googlegroups.com
> Sent: 10.10.'09, 18:08
>
> acho que o correto seria
>
> typedef typename myClass<T,R,C> myClass_t;

Por que? Não é membro de um nome dependente de argumentos de template. É puramente uma instanciação de uma template com tipos e valores constantes.

--
Felipe Magno de Almeida
Sent from my Nokia E71

Felipe Magno de Almeida

unread,
Oct 10, 2009, 6:06:39 PM10/10/09
to CcppBrasil
------- Original message -------
> From: Murilo Adriano Vasconcelos <muri...@gmail.com>
> To: ccppb...@googlegroups.com
> Sent: 10.10.'09, 17:06
>
> Olá pessoal, gostaria de saber se é possível fazer algo como:
>
> template<class T, unsigned R, unsigned C>
> class myClass
> {
> public:
> //tipo do objeto atual
> typedef myClass<T,R,C> myClass_t;
> };
>
> myClass<int, 1, 1> teste;
>
> teste::myClass_t teste2; //isso aqui
>
>
> Quero dizer, alguma maneira de eu passar o tipo do objeto template pelo
> próprio objeto.
> É óbvio que o exemplo acima está errado mas gostaria de saber como fazer
> algo parecido.

Infelizmente com o objeto você não pode pegar o tipo. Exceto com decltype do C++0x ou alguma extensão do compilador. Mas você pode usar em alguns casos usar a inferencia de funções template pra conseguir o tipo.

> Obrigado.
>
> --
> Murilo Adriano Vasconcelos
> Ciência da Computação INF-UFG
> Universidade Federal de Goiás
>
> >
>




Murilo Adriano

unread,
Oct 11, 2009, 10:32:10 AM10/11/09
to ccppb...@googlegroups.com
Não faz sentido isso uma vez que teste eh a mesma coisa que
teste::myClass_t. Se eu tenho teste eu já saberia o tipo...

Regards,

Murilo Adriano Vasconcelos
@ iPhone

Thiago A.

unread,
Oct 13, 2009, 3:06:15 PM10/13/09
to ccppbrasil
Uma vez fiz um teste (leia-se gambiarra) que foi o seguinte:

Defini uma struct que recebe uma referencia de typeinfo. (Colocar uma
referencia no tipo do template já parece uma locura)

template<const type_info &ref_type_info> struct TypeOf;

Depois eu criei especializações para alguns tipos

template<> struct TypeOf<typeid(int)> { typedef int Type; };
template<> struct TypeOf<typeid(double)> { typedef double Type; };


E isso permitiu descobrir o tipo do parametro.

Exemplo:

struct X {
double *p;
int i;
};

template<> struct TypeOf<typeid(X)> { typedef X Type; };

void func(X &x) {
TypeOf<typeid(*x.p)>::Type d = 3.4;
TypeOf<typeid(x.i)>::Type i = 1;
TypeOf<typeid(x)>::Type x2;
}

Compilei no VC++.

De todas as gambiarras eu posso citar o seguinte:
Não existe garantia que o typeid retorne o mesmo ID (objeto) para a
mesma classe. Outra coisa é colocar uma referencia como parte da
especializacao.
Mas nunca soube explicar direito por que isso é locura. Afinal se o
compilador não achasse uma especialização não iria nem compilar.
Nunca testei no gcc.





Thiago A.

unread,
Oct 13, 2009, 3:12:32 PM10/13/09
to ccppbrasil
Uma outra implementação, portável segundo o autor, pode ser encontrada
aqui:
http://www.accu-usa.org/2000-05-Main.html

Reply all
Reply to author
Forward
0 new messages