Hi all, I'm new to Boost and have some questions about how to get data out of a vector<boost::variant<> > container. For this purpose I put together 'class Base' which holds a vector<boost::variant <Base*, DerivedBase*> > Pointers. I wrote a function template to insert pointers, but I have real difficulty extracting pointers. For example, if I insert 3 Base* pointers and 2 DerivedBase* pointers, I need to be able to extract the 3 Base * pointers and the 2 DerivedBase* pointers at a later point in time. To this end, class Base* has another member function 'template< typename C> int numPointer( C * InPointer)' which is intended to count the number of pointers found in the container.
template< typename C> int numPointer(C* InPointer) has a few problems: 1) typeid(Pointers[i]) returns the 'variant' typeid when I really need to know the typeid of the ith pointer in 'Pointers'. 2) There must be a better, more elegant (and safe) way to make use of the boost library to accomplish just what I want.
int main() {
Base * TempBase = new Base();
DerivedBase * TempDeri = new DerivedBase();
TempBase->insert(TempBase);
TempBase->insert(TempBase);
TempBase->insert(TempDeri);
std::cout << "Base:" << TempBase->numPointer(TempBase) << endl; //Expect "Base:2" get "Base:0" because of typeid().
std::cout << "Deri:" << TempBase->numPointer(TempDeri) << endl; //Expect "Deri:1" get "Deri:0" because of typeid().
}
class Base {
private:
vector<boost::variant <Base*, DerivedBase*> > Pointers;
public:
Base();
virtual ~Base();
template <typename C> void insert( C * inC )
{
Pointers.push_back(inC);
}
template <typename C> int numPointer( C* inC ) {
int counter(0);
for ( int i(0); i < int(Pointers.size()); i++ ) {
cout << "type:" << typeid(inC).name() << endl;
cout << "typeP:" << typeid(Pointers[i]).name() << endl; //Will give the id of the container not Pointer[i].
//if( boost::is_same<Pointers[i],typeid(inC).name()>::value ){ //Compilation error
if ( typeid(inC).name() == typeid(Pointers[i]).name() ) {counter++;
}
}
return counter;}
};
//Base
Any advice on how to improve this code and/or make better use of the boost library is fully appreciated.
Thanks,
Matt