Re: Data dispatching using dynamic_cast. How to avoid it?
* D. Susman:
On Mar 13, 7:11 pm, Erik Wikstr?m <Erik-wikst...@telia.com> wrote:
On 2008-03-13 16:45, D. Susman wrote:
Hi,
I am working on a data centric project. I have a Process function that
will be called by some thread. The signature goes:
void Process( Base* base )
{
}
There are hundred possibilities on what "base" actually (i.e. actual
run-time type) is. I would like to avoid the bulky if statements to
handle the downcasts. Is there a common approach/idiom to handle that?
You want Base to have a process() function so you can do something like
this:
void Process( Base* base )
{
base->process();
}
And then all you need to do is override the process() function in all
the base-classes.
--
Erik Wikstr?m
That is not possible since Base objects have been designed as bean
classes due to the used data distribution technology, i.e. classes
holding only data & get/sets (I know this is not good OO but think of
it as a sort of legacy I have deal with)
class IBase
{
public:
typedef boost::shared_ptr<IBase> Ptr;
virtual ~IBase() {}
virtual void process() = 0;
};
class SensibleA: virtual IBase
{
private:
boost::shared_ptr<BeanA> myData;
SensibleA( SensibleA const& );
SensibleA& operator=( SensibleA const& );
public:
typedef boost::shared_ptr<SensibleA> Ptr;
explicit SensibleA( BeanA* pData ): myData( pData ) {}
virtual void process() { ... }
};
IBase::ptr sensibleFrom( Base* p ) { ... }
// This function might be simplified by using a factory repository
// with factories identified by some bean class id.
void process( IBase::Ptr pBean )
{
pBean->process();
}
Cheers, & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?