470,596 Members | 1,684 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,596 developers. It's quick & easy.

Extracting template types from a typedef'd template declaration

Hi everyone,

Yet another syntax problem that's baffling me with templates. I want to
instantiate a template with a single parameter as per normal, however
the parameter is actually a template class itself, with all *its*
parameters filled out (in the form of a typedef.) I can't work out how
to break apart the typedef to reveal what data types were used to create
it in the first place.

Here is some example code that demonstrates the problem. I've tried
every syntax I can think of but I haven't managed to hit upon the right
one yet! Any suggestions would be much appreciated.

Many thanks as always,
Adam.
#include <iostream>

template <class TFrom, class TTo>
class CLinkData;

class A { };
class B { };

typedef CLinkData<A, BMyLink;

// How do you declare the template to accept a CLinkData parameter, but
// broken out into its component types?
//template <template <class TLinkFrom, class TLinkToclass TLinkData>
//template <template <class TLinkFrom, class TLinkTo>
// class TLinkData<TLinkFrom, TLinkTo
template <class CLinkData<TLinkFrom, TLinkTo
void createStoredLink(void)
{
std::cerr << "CLinkData types are " << typeid(TLinkFrom).name() <<
" and " << typeid(TLinkTo).name() << std::endl;
// TLinkFrom should be A, and TLinkTo should be B, the types used
// to declare MyLink.
return;
}

int main(void)
{
createStoredLink<MyLink>();
return 0;
}
Oct 18 '07 #1
3 1668
On Oct 18, 4:40 am, Adam Nielsen <adam.niel...@remove.this.uq.edu.au>
wrote:
Hi everyone,

Yet another syntax problem that's baffling me with templates. I want to
instantiate a template with a single parameter as per normal, however
the parameter is actually a template class itself, with all *its*
parameters filled out (in the form of a typedef.) I can't work out how
to break apart the typedef to reveal what data types were used to create
it in the first place.

Here is some example code that demonstrates the problem. I've tried
every syntax I can think of but I haven't managed to hit upon the right
one yet! Any suggestions would be much appreciated.

Many thanks as always,
Adam.

#include <iostream>

template <class TFrom, class TTo>
class CLinkData;

class A { };
class B { };

typedef CLinkData<A, BMyLink;

// How do you declare the template to accept a CLinkData parameter, but
// broken out into its component types?
//template <template <class TLinkFrom, class TLinkToclass TLinkData>
//template <template <class TLinkFrom, class TLinkTo>
// class TLinkData<TLinkFrom, TLinkTo
template <class CLinkData<TLinkFrom, TLinkTo
void createStoredLink(void)
{
std::cerr << "CLinkData types are " << typeid(TLinkFrom).name() <<
" and " << typeid(TLinkTo).name() << std::endl;
// TLinkFrom should be A, and TLinkTo should be B, the types used
// to declare MyLink.
return;

}

int main(void)
{
createStoredLink<MyLink>();
return 0;

}- Hide quoted text -

- Show quoted text -
Hi,
try one of the following.
Bye,
Francesco B.

#include <iostream>
#include <typeinfo>

template< typename T >
struct CTypeFromType
{};

template <class TFrom, class TTo>
class CLinkData;
class A { };
class B { };
typedef CLinkData<A, BMyLink;

// first method

template< typename TFrom, typename TTo >
void createStoredLinkAux( CTypeFromType< CLinkData< TFrom, TTo )
{
std::cerr << "CLinkData types are " << typeid(TFrom).name() <<
" and " << typeid(TTo).name() << std::endl;

return;

}

template < typename T >
inline void createStoredLink(void)
{
createStoredLinkAux( CTypeFromType< T >() );
}

// second method

template< typename T >
struct CCreateStoredLink
{};

template< typename TFrom, typename TTo >
struct CCreateStoredLink< CLinkData< TFrom, TTo
{
static void Do()
{
std::cerr << "CLinkData types are " << typeid(TFrom).name() <<
" and " << typeid(TTo).name() << std::endl;

return;
}
};

int main(void)
{
createStoredLink<MyLink>();
CCreateStoredLink<MyLink>::Do();
//createStoredLink< int >(); //compile time error
//CCreateStoredLink< int>::Do(); // compile tiem error
std::cin.get();
return 0;
}

Oct 18 '07 #2
Hi,
try one of the following.
Bye,
Francesco B.

// first method
I like this one the best, I'll use that. Thanks for your help! That
CTypeFromType idea is turning out to be quite versatile :-)

Cheers,
Adam.
Oct 19 '07 #3
On Oct 19, 2:34 am, Adam Nielsen <adam.niel...@remove.this.uq.edu.au>
wrote:
Hi,
try one of the following.
Bye,
Francesco B.
// first method

I like this one the best, I'll use that. Thanks for your help! That
CTypeFromType idea is turning out to be quite versatile :-)

Cheers,
Adam.
Have a look at Alexandrescu's "Modern C++ Design" Techniques chapter.
There are quite a few interesting things in there.

Most probably there are many other books like that, but I don't have
much time to read...
;-)
Bye,
FB

Oct 19 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by Thomas Matthews | last post: by
6 posts views Thread by Hendrik Schober | last post: by
1 post views Thread by mathieu | last post: by
19 posts views Thread by aaragon | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.