tool::static_base< Bottom > Struct Template Reference

Base class of all static hierachies. More...

#include <wipal/tool/static_base.hh>

List of all members.

Public Member Functions

typedef wp_get_exact (Bottom, static_base< Bottom >) exact_type
Downcast methods
const exact_type & exact () const
exact_type & exact ()
const exact_type * exact_ptr () const
exact_type * exact_ptr ()


Detailed Description

template<class Bottom>
struct tool::static_base< Bottom >

Base class of all static hierachies.

A static hierarchy is a class hierarchy within which each class knows its exact type thanks to specific template parameters.

E.g.

   static_base<cow> : animal<cow> : mammal<cow> : cow

static_base's main role is to provide the exact() and exact_ptr() methods. These methods allow intermediate classes in the hierarchy to static_cast themselves directly to their exact type. This is perfectly type safe.

E.g.

   template <class Exact>
   void
   animal<Exact>::eat()
   {
     this->exact().eat_impl(); // Delegate eat() to Exact::eat_impl().
   }

In the previous example however, one cannot subclass cow because it has no Exact parametter. Use the bottom class to solve this issue:

   static_base<cow<bottom>> : animal<cow<bottom>> : mammal<cow<bottom>> :
     cow<bottom>

     or

   static_base<highland_cow<bottom>> : animal<highland_cow<bottom>> :
     mammal<highland_cow<bottom>> : cow<highland_cow<bottom>> :
     highland_cow<bottom>

In this example however, cow must provide to mammal either highland_cow<bottom> either cow<bottom>, depending on its template parameter. This is done using the get_exact trait:

   template <class Bottom>
   struct cow:
     public mammal<typename get_exact< Bottom, cow<Bottom> >::return_type>
   {
     // Inherit mammal<cow<bottom>> if Bottom = bottom,
     // inherit mammal<Bottom>, else.

     // ...
   };

For simple cases, we provide the wp_get_exact() and wp_inherit() preprocessor macros:

   template <class Bottom>
   struct cow: wp_inherit(public mammal, cow<Bottom>)
   {
     typedef wp_get_exact(Bottom, cow<Bottom>) exact_type;

     // ...
   };

Member Function Documentation

template<class Bottom>
typedef tool::static_base< Bottom >::wp_get_exact ( Bottom  ,
static_base< Bottom >   
)

Exact type for this template instanciation.

See also:
static_base

template<class Bottom>
const static_base< Bottom >::exact_type & tool::static_base< Bottom >::exact (  )  const [inline]

Safely downcast to the exact type as a const reference.

template<class Bottom>
static_base< Bottom >::exact_type & tool::static_base< Bottom >::exact (  )  [inline]

Safely downcast to the exact type as a non-const reference.

template<class Bottom>
const static_base< Bottom >::exact_type * tool::static_base< Bottom >::exact_ptr (  )  const [inline]

Safely downcast to the exact type as a const pointer.

template<class Bottom>
static_base< Bottom >::exact_type * tool::static_base< Bottom >::exact_ptr (  )  [inline]

Safely downcast to the exact type as a non-const pointer.


The documentation for this struct was generated from the following files:
Generated on Wed Jan 16 16:15:15 2008 for wipal by  doxygen 1.5.4