"простой" пример: не понимаю его использование на С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by cupper, 26 Nov 2010.

  1. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Читаю выдержки "бывалого" по С++, в статье приводится пример. Следов за ним автор пишет, цитирую :
    Что сильно меня огорчило потому что я вообще не понимаю этого примера
    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;
    };
    
    Дальше в примере показывается использование этого класса. Я его специально не привожу. Мне интересно действительно ли этот пример простой и я тупой, или он все таки сложный и я не совсем тупой.
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Несложный класс для хранения объектов любых типов. Классический абстрактный нешаблонный базовый класс и унаследованный от него шаблонный, чтобы уйти от создания класса variant полностью как шаблона. Оператор присваивания перегруженный, чтобы объекту можно было присвоить значение любого типа (массив тут не прокатит), и оператор преобразования типа, чтобы это значение можно было потом получить. Все просто.

    Пример использования:
    PHP:
    variant a;
    5//сейчас он хранит int
    std::cout << static_cast<int>(a) << std::endl;

    std::string("lol"); //а сейчас - std::string
    std::cout << static_cast<std::string>(a) << std::endl;
     
    #2 GRRRL Power, 26 Nov 2010
    Last edited: 26 Nov 2010
  3. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    а ты уже встречался с этим паттерном ?

    Я просто первый раз читал(узнал) про него и мне потребовалось подхода 3 чтобы до конца осмыслить всю механику внутри класса.
     
    #3 cupper, 27 Nov 2010
    Last edited: 27 Nov 2010
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Встречался с подобным. Но разобраться несложно, зная синтаксис и шаблоны, тут всего полсотни строк кода.