Re: Design question: alternative to inheritance.
ram@zedat.fu-berlin.de (Stefan Ram) writes:
By a combination of two dynamic-static adaptors, one gets the
visitor pattern. This might be elaborated in another post.
The following example for the visitor pattern might deviate
from the visitor pattern published elsewhere, because I have
only used two types, ?A? and ?B?, and I have ?reinvented? it
from my recollection, without verification with the literature.
But at least it shows a combination of two dynamic-static
adaptors to get a ?bidynamic-bistatic adaptor?:
#include <iostream>
#include <ostream>
struct A;
struct B;
struct S
{ static void static_process( ::A const * const a, ::A const * const a_ )
{ ::std::cout << "::S::static_process( A, A )\n"; }
static void static_process( ::A const * const a, ::B const * const b )
{ ::std::cout << "::S::static_process( A, B )\n"; }
static void static_process( ::B const * const b, ::A const * const a )
{ ::std::cout << "::S::static_process( B, A )\n"; }
static void static_process( ::B const * const b, ::B const * const b_ )
{ ::std::cout << "::S::static_process( B, B )\n"; }};
struct X
{ virtual void process( ::A const * const a )const = 0;
virtual void process( ::B const * const b )const = 0;
virtual void process( ::X const * const x )const = 0; };
struct A : public ::X
{ void process( ::A const * const a )const{ ::S::static_process( a, this ); }
void process( ::B const * const b )const{ ::S::static_process( b, this ); }
void process( ::X const * const x1 )const{ x1->process( this ); }};
struct B : public ::X
{ void process( ::A const * const a )const{ ::S::static_process( a, this ); }
void process( ::B const * const b )const{ ::S::static_process( b, this ); }
void process( ::X const * const x1 )const{ x1->process( this ); }};
int main()
{ ::A const a;
::B const b;
::X const * x0;
::X const * x1;
x0 = &a; x1 = &a; x0->process( x1 );
x0 = &a; x1 = &b; x0->process( x1 );
x0 = &b; x1 = &a; x0->process( x1 );
x0 = &b; x1 = &b; x0->process( x1 ); }
::S::static_process( A, A )
::S::static_process( A, B )
::S::static_process( B, A )
::S::static_process( B, B )
(The last four lines are the output.)