ciao.
Sto cercando di capire il type erasure , ma ho un qualche problema:

codice:
class Weapon {};
class Armor {};
class Helmet {};
class Scroll {};
class Potion {};

class Object {
   struct ObjectConcept {
       virtual ~ObjectConcept() {}
   };

   template< typename T > struct ObjectModel : ObjectConcept {
       ObjectModel( const T& t ) : object( t ) {}
       virtual ~ObjectModel() {}
     private:
       T object;
   };

   boost::shared_ptr<ObjectConcept> object;

  public:
   template< typename T > Object( const T& obj ) :
      object( new ObjectModel<T>( obj ) ) {}
};

int main() {
   std::vector< Object > backpack;

   backpack.push_back( Object( Weapon( SWORD ) ) );
   backpack.push_back( Object( Armor( CHAIN_MAIL ) ) );
   backpack.push_back( Object( Potion( HEALING ) ) );
   backpack.push_back( Object( Scroll( SLEEP ) ) );
}
in virtu di cosa il tipo scompare?

codice:
 template< typename T > Object( const T& obj ) :
      object( new ObjectModel<T>( obj ) ) {}
questo costruttore non ha un tipo template?

e allora come mai

codice:
backpack.push_back( Object( Weapon( SWORD ) ) );
//non è
backpack.push_back( Object<xxx>( Weapon( SWORD ) ) );
in cosa è utilizzato principalmente il type erasure?
ho visto un per esempio any di boost .
grazie.