Listing 3: New template implementation
class RegularExpression { public: virtual ~RegularExpression() {} virtual RegularExpression * RepeatMe() { throw std::exception( "I cannot repeat" ); } virtual bool Interpret( const char *& ) const = 0; }; template< typename RE > class Repeater : public RegularExpression { RE * repeat_; public: Repeater( RE * repeat ) : repeat_( repeat ) {} virtual bool Interpret( const char *& sz ) const { while( repeat_->RE::Interpret( sz ) ) ; return true; } }; class LiteralExpression : public RegularExpression { char ch_; public: LiteralExpression( char ch ) : ch_( ch ) {} virtual Repeater<LiteralExpression> * RepeatMe() { // I repeat myself. return new Repeater<LiteralExpression>( this ); } virtual bool Interpret( const char *& sz ) const { return ( *sz == ch_ ) ? ( ++sz, true ) : false; } }; End of Listing