привет. имеется следующий код: Код (Text): struct AbstractProperty { virtual ~AbstractProperty(){}; virtual void Set(const std::string &value) = 0; }; template <typename T> class Property : public AbstractProperty { public: Property(T &value) :_value(value){} void Set(const std::string &value) { _value = boost::lexical_cast<T>(value); } private: T &_value; }; class VariableContainer { typedef boost::shared_ptr<AbstractProperty> PropertyPtr; typedef std::map<std::string, PropertyPtr> NameToPropertyMap; public: template <class T> void Register(const std::string &name, T &var) { _map[name] = PropertyPtr(new Property<T>(var)); } template <class T> void Set(const std::string &name, const std::string &value) { _map[name]->Set(value); } private: NameToPropertyMap _map; }; который, собссно вызывается след. образом: Код (Text): int main() { VariableContainer c; int i(0); std::string str(""); c.Register("int", i); c.Register("str", str); c.Set<int>("int", "12"); c.Set<std::string>("str", "hello"); std::cout << i << std::endl; std::cout << str << std::endl; return 0; } просится дополнить его, чтобы обращаясь к VariableContainer-у, можно было бы не только регить переменные и устанавливать их значения, но и получать их значения. короче, Getter просится (чтобы можно было писать "int value = c.Get("int")". не пойму лишь, как его добавить в AbstractProperty, т.к. на этом уровне тип данных Т еще не известен. ткните носом, как здесь выкрутиться, плиз.
В AbstractProperty никак, ибо шаблонный метод не может быть виртуальным. Можно заюзать RTTI и dynamic_cast, но придётся пожертвовать некоторой функциональностью, а именно boost::shared_ptr<AbstractProperty>, т.к. shared_ptr не является полиморфным классом(можешь написать свою обёртку). В общем с учётом всего вышесказанного решение может быть таким: Код (Text): template <typename T> class Property : public AbstractProperty { public: Property(T &value) :_value(value){} void Set(const std::string &value) { _value = boost::lexical_cast<T>(value); } T Get() { return _value; } private: T &_value; }; class VariableContainer { typedef std::map<std::string, AbstractProperty*> NameToPropertyMap; public: template <class T> void Register(const std::string &name, T &var) { _map[name] = new Property<T>(var); } template <class T> void Set(const std::string &name, const std::string &value) { _map[name]->Set(value); } template<class T> T Get(const std::string &type) { if (Property<T>* p = dynamic_cast< Property<T>* >(_map[type])) return p->Get(); else return 0; } private: NameToPropertyMap _map; }; int _tmain(int argc, _TCHAR* argv[]) { VariableContainer c; int i(0); std::string str(""); c.Register("int", i); c.Register("str", str); c.Set<int>("int", "12"); c.Set<std::string>("str", "hello"); std::cout << c.Get<int>("int") << std::endl; std::cout << c.Get<std::string>("str") << std::endl; std::cout << i << std::endl; std::cout << str << std::endl; return 0; }