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