Static Reflection
      Reflection lets one examine objects and their properties in a program at runtime.
Typically, this is provided by a runtime. Using TemplateMetaprogrammingTechniques, compile-time reflection emerges - the ability to examine, for example, whether a member function (with a specific name and signature) is present for a given object.
This can be used to create object hierarchies in CeePlusPlus that do not rely on inheritance - rather, objects are organized by their function names, signatures and the convention that a name and signature in an object describes loosely its semantic meaning.
        
A CeePlusPlus example follows:
        struct food;
        struct animal
        {
        void eat(food*);
        void sleep(double);
        };
      
      
        struct path;
        struct biped
        {
        void walk(path*);
        };
      
      
        struct statement;
        struct human 
        {
        // animal
        void eat(food*);
        void sleep(double d);
      
      
        // biped
        void walk(path*);
      
      
        // human
        void talk(statement*);
        };
      
      
        FW_HAS_FUNCTION(eat);
        FW_HAS_FUNCTION(talk);
        FW_HAS_FUNCTION(walk);
        FW_HAS_FUNCTION(sleep);
      
      
        template  bool looks_like_an_animal()
        {
        return 
        has_function_eat::value &&
        has_function_sleep::value;
        }
         
      
        template  bool looks_like_a_biped()
        {
        return has_function_walk::value;
        }
        
      
        template  bool looks_like_a_human()
        {
        return 
        looks_like_an_animal() &&
        looks_like_a_biped  () &&
        has_function_talk	::value;
        }
          
      
        template  void act_like_an_animal(T& t)
        {
        food* nothing = 0;
        t.eat(nothing);
        t.sleep(34.45);
        }
       
      
        template  void act_like_a_biped(T& t)
        {
        path* nowhere = 0;
        t.walk(nowhere);
        }
       
      
        template  void act_like_a_human(T& t)
        {
        statement* ergocognisum = 0;
        act_like_an_animal(t);
        act_like_a_biped(t);
        t.talk(ergocognisum);
        }
       
      
        void test_has()
        {
        _ASSERT(true  == looks_like_an_animal());
        _ASSERT(false == looks_like_an_animal());
        _ASSERT(true  == looks_like_an_animal());
         
      
        _ASSERT(false == looks_like_a_biped());
        _ASSERT(true  == looks_like_a_biped());
        _ASSERT(true  == looks_like_a_biped());
         
      
        _ASSERT(false == looks_like_a_human());
        _ASSERT(false == looks_like_a_human());
        _ASSERT(true  == looks_like_a_human());
         
      
        // let's be ourselves
        animal aardvark; biped chimp; human harry;
        act_like_an_animal(aardvark);
        act_like_an_animal(harry);
        act_like_a_biped(chimp);
        act_like_a_biped(harry);
        act_like_a_human(harry);
        }
      
      See also TemplateMetaprogrammingTechniques, TemplateMetafunctionHasFunction, ReadMacro