Здравствуйте, Аноним, Вы писали:
А>здравствуйте.
А>был бы признателен если бы кто-нибудь натолкнул меня на идею о том, как имплементировать иерархию классов, имеющих единый интерфейс (скажем, 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);