Given the following
#include
<boost/preprocessor/repetition/enum_params.hpp>
#ifndef TYPELIST_MAX_SIZE
# define TYPELIST_MAX_SIZE 7
#endif
template <BOOST_PP_ENUM_PARAMS(TYPELIST_MAX_SIZE, class
T)>
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<IObject const
*>(this);
break;
}
// Desired: for each type T in typelist generate
the following case block
// case T::IID :
// {
// this->acquire();
// obj = static_cast<T const *>(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