Re: Downcast with smart pointers?
Hi,
On Jul 21, 6:23 pm, alebc...@gmail.com wrote:
On Jul 21, 11:55 pm, "BobR" <removeBadB...@worldnet.att.net> wrote:
<alebc...@gmail.com> wrote in message...
And this is my problem. At some point I'd like to instantiate a
request or response data, but I don't know how to do it, as I'm using
smart pointers instead of plain pointers....
What good is a 'smart_pointer' (or any pointer) if you can't get at what it
points to?
If I were using simple pointers, I'd do a dynamic_cast, but how is
this done with a smart pointer?
Show what you have tried (and the first 3 errors if it didn't compile).
Alf P. Steinbach's "Pointers" document:http://home.no.net/dubjai/win32cpptut/special/pointers/ch_01.pdf
Hello, thanks for sharing that link, it looks like a nice book, I'll
give it a read.
The more I see this the more I think I'm not doing it "the right way"
May I ask you all what is the correct idiom (if there is just one..)
to do something like this?
I receive a byte stream from a network interface, so I instantiate a
generic message object:
SmartPtr<HttpMsg> msg(new HttpMsg(buffer));
When constructed, the class constructor parses the message
(generically) and then I have a message object, which is either a
request or a response (assuming there isn't any error). So here is my
problem then: given that some functionality only makes sense for
request or responses, I have to derive classes with some specific
methods:
class HttpRequest : public HttpMsg
{};
class HttpResponse : public HttMsg
{};
(Both derived classes contains only new methods, no data).
In some situations, I'd like to pass some of these objects to a
function, so assuming I have a generic function (because it could
either accept a request or response):
void foo(const SmartPtr<HttpMsg>& msg);
Then inside this function, I'd need to instantiate the correct object.
But how to do it? I tried:
SmartPtr<HttpResponse> resp = msg;
But of course doesn't work. If I were using normal pointers, then I'd
do dynamic_cast<HttpResponse*>(msg) and everything ok.
It doesn't work because there is no implicit conversion from
SmartPtr<HttpMsg> to SmartPtr<HttpResponse>. One possible way to do it
is to create a derived class from the standard smart pointer (of
course, if you have control of the pointer implemetation, do it
directly on its implementation), and add
a member template function in the auto_ptr implementation, similar to
this
template <class NEW_T>
operator auto_ptr<NEW_T>
{
return auto_otr<NEW_T> (dynamic_cast (NEW_T *> (this->get ()));
}
or add a static template function called _narrow, which do
template <class NEW_T>
static my_auto_ptr<new_T> __narrow (my_auto_ptr<T> &p)
{
new_T *new_p = dynamic_cast<new_T *> (p.get());
return my_auto_ptr<new_T>(new_p);
}
and invoke the conversion like this
My_SmartPtr<HttpResponse> resp = My_SmartPtr<msg>::_narrow
<HttpResponse> (msg)
it should work theoritically, but i didn't try it. HTH
So it seems that the SmartPtr needs to support this, unless there is
some other way to achieve similar functionality. I'm also concerned
about the smart pointer behaviour, as I wouldn't want to trash its
internal data and miss the advantage of using them.
Is my "design" ok? Or maybe is some easier way I'm missing?
Any advice?
Thanks.