472,093 Members | 2,507 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,093 software developers and data experts.

template <typename T> struct polymorphic : public T ???

Last week I asked here how I could detect that a T was polymorphic, and
received
very thoughtful and useful replies that I used straight away. Thanks to all who
answered.

This week, it turns out that detecting whether T is polymorphic clashes with
a new requirement, that T be allowed to not be complete.

Last week, this code used to compile:

typedef std::queue<Request> RequestQueue ;
typedef envelope<RequestQueue> Queue ;

This week, I now have to wrap std::queue into a polymorphic
container, as in:

struct RequestQueue : public std::queue<Request> {
// envelope does NOT work with monomorphic types
virtual ~RequestQueue() {} ;
} ;

typedef envelope<RequestQueue> Queue ;

Obviously, I'd like to create some kind of adaptor template ...

template <typename T> struct polymorphic : public T {
virtual ~polymorhic() {}
} ;

intended usage:

typedef polymorphic<std::queue<int> > Queue ;

But this doesn't compile!

The FAQ#35 seems mute here, and I'm beginning to suspect that
something is wrong with my syntax. I also checked
http://www.boost.org/libs/utility/call_traits.htm &
http://www.boost.org/libs/conversion/cast.htm (because it
contained the word: polymorphic_cast, but this turned out
a red-herring)

What would be the correct way to do this?

Many thanks, again.

--
JFB

Jul 23 '05 #1
1 2177
On 2005-06-25 16:55:32 +0100, verec <ve***@mac.com> said:
struct RequestQueue : public std::queue<Request> {
// envelope does NOT work with monomorphic types
virtual ~RequestQueue() {} ;
} ;

typedef envelope<RequestQueue> Queue ;

Obviously, I'd like to create some kind of adaptor template ...

template <typename T> struct polymorphic : public T {
virtual ~polymorhic() {}
} ;


I'm not sure exactly what went wrong, but this first version
was correct ...

#include <iostream>
#include <string>
#include <queue>
template <typename T> struct polymorphic : public T {
virtual ~polymorphic() {}
} ;

void
test_00001() {
typedef polymorphic<std::queue<int> > IntQueue ;

IntQueue queue ;

queue.push(5) ;
queue.push(6) ;
queue.push(7) ;
queue.push(8) ;

while(!queue.empty()) {
int i = queue.front() ;
queue.pop() ;
std::cout << "Just popped: " << i << std::endl ;
}
}

Though I couldn't find a single example of use that particular
syntax (which kind of turns templates inside out) it is
accepted by gcc 4.
--
JFB

Jul 23 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

11 posts views Thread by Scott Brady Drummonds | last post: by
1 post views Thread by ma740988 | last post: by
3 posts views Thread by ajay2552 | last post: by
10 posts views Thread by jason.cipriani | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.