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* from
// a vector
template
vector
*derivedSharedPtrVectorToBase(vector const &dVec)
{
vector *bVec = new
vector(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@lists.boost.org'
Subject: Collections of shared_ptr<Base> and shared_ptr<Derived>
Folks,
What is the best way to pass a
std::vector to a function that expects a
std::vector?
Can I use a cast or should I create a new
std::vector by iterating over the
std::vector?
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 &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 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 cannot be converted to
std::vector.