Читаю выдержки "бывалого" по С++, в статье приводится пример. Следов за ним автор пишет, цитирую : Что сильно меня огорчило потому что я вообще не понимаю этого примера Code: class variant { public: template <class T> variant& operator = (T const& t) { typedef type<T> assign_type; object = std::auto_ptr<assign_type>(new assign_type(t)); return *this; } template <class T> operator T () { typedef type<T> assign_type; assign_type& type = dynamic_cast<assign_type&>(*object); return type.get(); } private: class base { public: virtual ~base() {} }; typedef std::auto_ptr<base> base_ptr; template <class T> class type : public base { public: type(T const& t) : object(t) { } T get() const { return object; } private: T object; }; base_ptr object; }; Дальше в примере показывается использование этого класса. Я его специально не привожу. Мне интересно действительно ли этот пример простой и я тупой, или он все таки сложный и я не совсем тупой.
Несложный класс для хранения объектов любых типов. Классический абстрактный нешаблонный базовый класс и унаследованный от него шаблонный, чтобы уйти от создания класса variant полностью как шаблона. Оператор присваивания перегруженный, чтобы объекту можно было присвоить значение любого типа (массив тут не прокатит), и оператор преобразования типа, чтобы это значение можно было потом получить. Все просто. Пример использования: PHP: variant a; a = 5; //сейчас он хранит int std::cout << static_cast<int>(a) << std::endl; a = std::string("lol"); //а сейчас - std::string std::cout << static_cast<std::string>(a) << std::endl;
а ты уже встречался с этим паттерном ? Я просто первый раз читал(узнал) про него и мне потребовалось подхода 3 чтобы до конца осмыслить всю механику внутри класса.
Встречался с подобным. Но разобраться несложно, зная синтаксис и шаблоны, тут всего полсотни строк кода.