Connecting Tech Pros Worldwide Help | Site Map

Finding template argument of child

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 23rd, 2005, 12:50 AM
gao_bolin@voila.fr
Guest
 
Posts: n/a
Default Finding template argument of child

I have the following situation:

class A
{
public:
virtual ~A() {}
};

template < typename T >
class B : public A
{
};

The problem is to find the template argument T when a function receives
only a pointer A* (and we know for sure that the A* indeed points to a
B<T>*).

One way is to dynamic_cast to a bunch of know B<T>, but this is kind of
heavy and works only for types that are explicitely taken into account.
Is there a way to retrieve type T for any T, and say print it out?

Thanks

Bolin


  #2  
Old July 23rd, 2005, 12:50 AM
Ruslan Abdikeev
Guest
 
Posts: n/a
Default Re: Finding template argument of child

<gao_bolin@voila.fr> wrote in message
news:1108292120.509189.279300@z14g2000cwz.googlegr oups.com...[color=blue]
> template < typename T >
> class B : public A {};
>
> The problem is to find the template argument T when a function receives
> only a pointer A* (and we know for sure that the A* indeed points to a
> B<T>*).[/color]

In which context do you want to find the T?
If it is just to "say, print", then the easiest way is to define a
non-template intermediate base class which implements the necessary
interface:

#include <iostream>
#include <typeinfo>
#include <string>

struct A
{
virtual ~A() {}
};

struct B_base : A
{
std::string get_T_name() const { return vget_T_name(); }
private:
virtual std::string vget_T_name() const =0;
};

template<typename T>
struct B : B_base
{
private:
std::string vget_T_name() const { return typeid(T).name(); }
};

int main()
{
B<int> b_int;
A& a= b_int;
B_base& b_base= dynamic_cast<b_base&>( a );
std::cout << b_base.get_T_name() << std::endl;
}


Hope it helps,
Ruslan Abdikeev.


  #3  
Old July 23rd, 2005, 12:50 AM
adbarnet
Guest
 
Posts: n/a
Default Re: Finding template argument of child

How about:
class A

{

public:

A(){}

virtual ~A() {}

virtual const type_info & getTypeInfo() const {return typeid(A); }

};

template <class T>

class B : public A

{

public:


virtual const type_info & getTypeInfo() const {return typeid(T); }

};

int main(int argc, char **argv)

{

A anA;

A* pA = new B<int>;

std::cout << anA.getTypeInfo().name() << std::endl;

std::cout << pA->getTypeInfo().name() << std::endl;

return 0;

}

regards,
Aiden

<gao_bolin@voila.fr> wrote in message
news:1108292120.509189.279300@z14g2000cwz.googlegr oups.com...[color=blue]
>I have the following situation:
>
> class A
> {
> public:
> virtual ~A() {}
> };
>
> template < typename T >
> class B : public A
> {
> };
>
> The problem is to find the template argument T when a function receives
> only a pointer A* (and we know for sure that the A* indeed points to a
> B<T>*).
>
> One way is to dynamic_cast to a bunch of know B<T>, but this is kind of
> heavy and works only for types that are explicitely taken into account.
> Is there a way to retrieve type T for any T, and say print it out?
>
> Thanks
>
> Bolin
>[/color]



Posted Via Usenet.com Premium Usenet Newsgroup Services
----------------------------------------------------------
** SPEED ** RETENTION ** COMPLETION ** ANONYMITY **
----------------------------------------------------------
http://www.usenet.com
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,662 network members.