template question

J

John

Hi,

I have a templated class whose template parameter depends on a library.
For most platforms, the library defines a certain type as an
integer, so my original class was

//library code
typedef int SomeType;
SomeType ATYPE = 1;

//my code
template <int T> class A {};
...
A<ATYPE> a;

However, on a few platforms, that type is a structure/class, so the
above template fails since I need

//library code
struct X {};
typedef struct X SomeType;
SomeType ATYPE;

//my code
template <class T> class A {};
...
A<ATYPE> a;


template <class T> class A {};

Which of course fails when the library defines the type as an integer.
Is there anyway to make the template class accept both of these without
resorting to #ifdef's?

Thanks.
 
V

Victor Bazarov

I have a templated class whose template parameter depends on a library.
For most platforms, the library defines a certain type as an integer, so
my original class was

//library code
typedef int SomeType;
SomeType ATYPE = 1;

//my code
template <int T> class A {};
...
A<ATYPE> a;

However, on a few platforms, that type is a structure/class, so the
above template fails since I need

//library code
struct X {};
typedef struct X SomeType;
SomeType ATYPE;

//my code
template <class T> class A {};
...
A<ATYPE> a;


template <class T> class A {};

Which of course fails when the library defines the type as an integer.
Is there anyway to make the template class accept both of these without
resorting to #ifdef's?

Not really.

Does your class need to have the *value* as its template argument?
Perhaps you could rewrite it to make the constructor of your class
accept that argument.

If you're relying on the value/constant significantly and don't want to
introduce another member, etc., then #ifdef is the simplest approach.

You could try introducing some kind of framework that would *either* get
your 'a' defined as an object of the template based on the value (if
your 'SomeType' is an integral type, for instance) *or* as the
constructor argument (if 'SomeType' is not an integral type, that is),
but it could be quite convoluted, and I'm not sure you need that
complexity. Disclaimer: I've not attempted that, my speculation on the
complexity is just that, a speculation.

V
 
J

john

Not really.

Does your class need to have the *value* as its template argument?
Perhaps you could rewrite it to make the constructor of your class
accept that argument.

You are right. This is a better way to do it and avoids the problem.

Thanks,
John
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top