Boost logo

Boost :

From: Mark Coletti (mcoletti_at_[hidden])
Date: 2003-05-19 17:16:17

I'm trying to essentially do a dynamic_cast to an ABC parent class
with a child class stored in a boost::any object. I've skimmed
through old boost mailing list messages and saw some traffic last Fall
regarding a "dynany" class that seems to address that type of problem.

That is, consider the following code:

class Foo

      virtual ~Foo() {}

      virtual int get() const = 0;

}; // class Foo

class Bar : public Foo

      ~Bar() {}

      int get() const
         return 42;
}; // class Bar

main( int argn, char ** argv )
   any a = Bar();

      Foo * f = any_cast<Foo>(&a);

      if ( ! f )
         cerr << "bwana\n";
         return -2;
      cout << f->get() << endl;
   catch(const boost::bad_any_cast &)
      cerr << "bwack\n";
      return -1;

   return 0;

For which I get the following from g++ 3.2.2:

/home/mcoletti/include/boost_1_30_0/boost/any.hpp: In instantiation of
/home/mcoletti/include/boost_1_30_0/boost/any.hpp:158: instantiated
from `ValueType* boost::any_cast(boost::any*) [with ValueType = Foo]' instantiated from here
/home/mcoletti/include/boost_1_30_0/boost/any.hpp:102: cannot declare
field `boost::any::holder<Foo>::held' to be of type `Foo'
/home/mcoletti/include/boost_1_30_0/boost/any.hpp:102: because the
following virtual functions are abstract: virtual int Foo::get() const

Natch, making Foo::get() non pure virtual appeases the compiler, but
now I've traded a compilation error for a run-time one since Foo and
Bar's typeid()s obviously don't match. The critical source in
<boost/any.hpp> is:

    template<typename ValueType>
    ValueType * any_cast(any * operand)
      return operand && operand->type() == typeid(ValueType)
        ? &static_cast<any::holder<ValueType> *>(operand->content)->held
        : 0;

Something like use of the RTTI "before" operator would yield true, and
more accurately reflects what I want.

Any work-around suggestions? Any work continuing on dynany?



Mark Coletti                   |  He who hesitates is trampled by the mob.
mailto:mcoletti_at_[hidden] |     |

Boost list run by bdawes at, gregod at, cpdaniel at, john at