Re: неск. имплементаций с разным типом члена данных и м-да
От: Аноним  
Дата: 09.06.08 16:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>здравствуйте.

А>был бы признателен если бы кто-нибудь натолкнул меня на идею о том, как имплементировать иерархию классов, имеющих единый интерфейс (скажем, CBaseClass), но имеющих лишь одно различие по сути: тип хранимого значения, и тип метода по возвращению этого значения? единый интерфейс необходим для того, чтобы далее корректно работать с std::vector< CBaseClass *> и иметь тем самым возможность единой работы со всеми имплементациями класса CBaseClass.
А>т.е. хочется что-то в духе:
А>
А>  class CBaseClass{
А>    public:
А>        virtual ~CBaseClass(){};
А>    private:
А>        CBaseClass(){};    
А>  }
    
А>  template < typename Type, std::string TypeName >
А>  class CImpl : public CBaseClass{
А>    public:
А>            virtual ~CImpl(){}
А>        std::string getType() const{
А>            return _type;
А>        }    
А>        Type getValue() const{
А>            return _value;
А>        }
А>    protected:
А>        std::string _name;    //data's name in string representation
А>        std::string _type;    //data's type
А>        Type        _value;     //data's value
А>    };
А>

А>но в данном случае получается замкнутый круг -- чтобы через CBaseClass иметь возможность обращаться к Type CImpl::getValue() const; нужно добавить в этот класс метод Type getValue() const; но тогда нужно знать чему равен Type, который мы задаем на стадии параметризирования шаблона объектов класса CImpl.
А>как элегантно разрулить эту ситуацию?

можно конечно добавить в базовый класс абстрактный метод
    virtual void CBaseClass::getData(Destination &dst) = 0;

ну и соответственно во всех выведенных классах:
   template < typename Type, std::string TypeName >
   void CImpl::getData(Destination &dst){
       dst = _value;
   }

но хочется более элегантное решение... т.к. по-прежнему душа хочет писать
Destination dst = pBaseClass->getData();

а не
Destination dst;
pBaseClass->getData(dst);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.