Boost logo

Boost Users :

From: Keith Weintraub (Keith_at_[hidden])
Date: 2005-11-21 10:42:51


Folks,

  I have come up with the following solution in template form. I would
be ecstatic to receive any feedback on either my solution or original
question. I am not an expert in these things and I can use all the help
any generous soul could provide.

 

Here is my solution:

       // Function template to create a vector<shared_ptr<Base> >* from

       // a vector<shared_ptr<Derived> >

       template<typename Base, typename Derived>

       vector<shared_ptr<Base> >
*derivedSharedPtrVectorToBase(vector<shared_ptr<Derived> > const &dVec)
{

              vector<shared_ptr<Base> > *bVec = new
vector<shared_ptr<Base> >(dVec.size());

 

              for(int i = 0; i < dVec.size(); i++)

                     (*bVec)[i] = dVec[i];

              return(bVec);

       }

 

Thanks for your time,

KW

 

 

________________________________

From: Keith Weintraub
Sent: Wednesday, November 16, 2005 10:17 AM
To: 'boost-users_at_[hidden]'
Subject: Collections of shared_ptr<Base> and shared_ptr<Derived>

 

Folks,

            What is the best way to pass a
std::vector<boost::shared_ptr<Derived> > to a function that expects a
std::vector<boost::shared_ptr<Base> >?

 

Can I use a cast or should I create a new
std::vector<boost::shared_ptr<Base> > by iterating over the
std::vector<boost::shared_ptr<Derived> >?

 

Here is some sample code. What f is doing is not important it is just an
example:

 

class A { // This class is from a library I have no control over.

   public:

       virtual string getName() { return string("A");}

};

 

class B : public A { // I need to create B from A to have extra
functionality

   public:

       virtual string getName() { return string("B");}

       virtual string getLongName() { return string("This is B");}

};

 

void f(std::vector<boost::shared_ptr<A> > &v) { // This function is
from a library that I have no control over.

       for(int i = 0; i < v.size(); i++)

              cout << v[i]->getName();

}

 

 

int main(char *argv, int arc) {

       std::vector<boost::shared_ptr<B> > bvec(10);

       

       boost::shared_ptr<B> bPtr(new B);

 

       bvec[0] = bPtr;

 

       f(bvec); // This should not compile. <-------------------------

}

 

 

The last line (with the arrow) won't compile because
std::vector<boost::shared_ptr<B> > cannot be converted to
std::vector<boost::shared_ptr<A> >.

 

 



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net