Дано:
class CAbstractBase
{
void foo() = 0;
};
class CConcreteClass : public CAbstractBase
{
void foo(){};
};
class CConcreteClass2 : public CAbstractBase
{
void foo(){};
};
//
// smart_ptr - шаблонный класс, некий "умный указатель".
//
CAtlMap< int, smart_ptr< CAbstractBase > > mapList;
CConcreteClass * pConcrete = new CConcreteClass;
smart_ptr< CAbstractBase > spMyPtr( pConcrete );
//
// не помню как называется ф-ция добавления эл-та в CAtlMap,
// но смысл понятен - добавили переменную в ассоциативный массив
//
mapList.Add( 1, spMyPtr );
CConcreteClass2 * pConcrete2 = new CConcreteClass2;
smart_ptr< CAbstractBase > spMyPtr2( pConcrete2 );
mapList.Add( 2, spMyPtr );
Что хотелось бы иметь:
smart_ptr< CConcreteClass > sp;
mapList.Lookup( 1, sp );
smart_ptr< CConcreteClass2 > sp2;
mapList.Looup( 2, sp2 );
Каким образом это реализовать?
Здравствуйте, Аноним, Вы писали:
А>Что хотелось бы иметь:
А>smart_ptr< CConcreteClass > sp;
А>mapList.Lookup( 1, sp );
А>smart_ptr< CConcreteClass2 > sp2;
А>mapList.Looup( 2, sp2 );
А>Каким образом это реализовать?
А какова должна быть реакция этого кода на то, что в мапе под ключем 1, например, хранится не CConcreteClass, а CConcreteClass2 ?
Здравствуйте, gbt, Вы писали:
gbt>Здравствуйте, Аноним, Вы писали:
А>>Что хотелось бы иметь:
gbt>А>>smart_ptr< CConcreteClass > sp;
А>>mapList.Lookup( 1, sp );
А>>smart_ptr< CConcreteClass2 > sp2;
А>>mapList.Looup( 2, sp2 );
gbt>
А>>Каким образом это реализовать?
gbt>А какова должна быть реакция этого кода на то, что в мапе под ключем 1, например, хранится не CConcreteClass, а CConcreteClass2 ?
Пусть кидает эксепшн. Считаем что ключ и класс сопоставляются однозначно, т.е. ключ является идентификатором типа.