sorry, forgot to derive ABCDerived1 form ABCBase ;) But hope you got the intention.

On Mon, Aug 3, 2009 at 5:33 PM, Ovanes Markarian <om_boost@keywallet.com> wrote:
Hi!

The only solution I can come up with is the declaration of the visitor in your ABCBase as virtual function and visitor has a function template to dispatch different types:


class ABCVisitor
{
    public:
    template<class T>
    void visit(T& t)
    {
      // no visit implemented ...
    }
};


class ABCBase
{
   //... dtor, copy ctor, assignment operator etc.

   public:
   void accept_visitor(ABCVisitor& v)
   {
       do_accept_visitor(v);
   }  

   private:
   virtual void accept_visitor(ABCVisitor& v)=0;
};


class ABCDerived1 : public ABCBase
{
   //... dtor, copy ctor, assignment operator etc.
   void accept_visitor(ABCVisitor& v)
   {
       v.visit(*this);
   }
};

template<>
void ABCVisitor::visit<ABCDerived1>(ABCDerived1& derived)
{
   // handle derived here...
}


Hope that helps,
Ovanes