Given the following
#include
#ifndef TYPELIST_MAX_SIZE
# define TYPELIST_MAX_SIZE 7
#endif
template
class ObjectImpl : BOOST_PP_ENUM_PARAMS(TYPELIST_MAX_SIZE, public T), public
ObjectBase<REFCNTR>
{
public:
virtual Refcount acquire() const
{
return Base::acquire();
}
virtual Refcount release() const
{
return Base::release();
}
virtual Refcount getRefcount() const
{
return Base::getRefcount();
}
virtual bool hasInterface(InterfaceID const & iid) const
{
return Base::hasInterface(iid);
}
virtual IObject * getInterface(InterfaceID const & iid)
{
IObject const * const_this = (IObject const *) this;
return (IObject *) const_this->getInterface(iid);
}
virtual IObject const * getInterface(InterfaceID const & iid)
{
IObject const * obj = 0;
switch (iid)
{
case IObject::IID :
{
this->acquire();
obj = static_cast(this);
break;
}
// Desired: for each type T in typelist generate the following
case block
// case T::IID :
// {
// this->acquire();
// obj = static_cast(this);
// break;
// }
default :
{
throw InterfaceUnsupportedException(iid)
break
}
}
return obj;
}
protected:
ObjectImpl()
{
}
virtual ~ObjectImpl()
{
}
typedef ObjectBase<REFCNTR> Base;
};
What is the best way to generate a case block for each type in the typelist?
I've been looking at the Preprocessor appendix from the "C++ Template
Metaprogramming" book (can't wait!) and see three different approaches to
vertical repetition: local, file and self; however, I'm not clean on how to
express what I want using these approaches. Can someone shed some light, or
point me to an example in the Boost PP docs which solves a similar problem?
Many thanks in advance.
-allen