boost::any - хранение и удаление объектов
От: Ryadovoy  
Дата: 15.07.11 05:16
Оценка:
Хочу решить задачу:
необходимо хранить указатели на объекты произвольных типов данных с возможностью удаления в порядке, обратном добавлению объектов.
в итоге соорудил следующий класс:
class CObjectsHolder
{
    class IItem
    {
    public:
        virtual ~IItem(){}
    };
    template<typename T>
    class CItem : public IItem
    {
    public:
        CItem(T* pT)
        {
            m_pT = pT;
        }
        virtual ~CItem()
        {
            delete m_pT;
        }
    private:
        T* m_pT;
    };
    typedef std::stack<IItem*> CObjects;
public:
    ~CObjectsHolder()
    {
        while(!m_Objects.empty())
        {
            delete m_Objects.top();
            m_Objects.pop();
        }
    }
    template<typename T>
    void Push(T* pT)
    {
        m_Objects.push(new CItem<T>(pT));
    }
private:
    CObjects   m_Objects;
};
...
//где-то в программе
CObjectsHolder holder;
...
//еще где-то в программе
COne* pOne = new COne();
holder.Push(pOne);

CTwo* pTwo = new CTwo(pOne);
holder.Push(pTwo);

CThree* pThree = new CThree(pOne, pTwo);
holder.Push(pThree);


Но сегодня заметил, что существует boost::any, который схож по функциональности.
Вопрос:
1) Как правильно использовать boost::any для моей задачи?
У меня получилось что-то вроде:
        std::stack<boost::any> holder;
        holder.push(boost::shared_ptr<int>(new int));


2) Есть ли лучшее решение чем boost::any
Re: boost::any - хранение и удаление объектов
От: XuMuK Россия  
Дата: 15.07.11 09:23
Оценка:
Здравствуйте, Ryadovoy, Вы писали:

R>Хочу решить задачу:

R>необходимо хранить указатели на объекты произвольных типов данных с возможностью удаления в порядке, обратном добавлению объектов.
R>в итоге соорудил следующий класс:

R>Но сегодня заметил, что существует boost::any, который схож по функциональности.

R>Вопрос:
R>1) Как правильно использовать boost::any для моей задачи?
R> У меня получилось что-то вроде:
R>
R>        std::stack<boost::any> holder;
R>        holder.push(boost::shared_ptr<int>(new int));
R>


R>2) Есть ли лучшее решение чем boost::any


если нужно только удаление, то достаточно шаред поинтеров:

#include <boost/shared_ptr.hpp>
#include <iostream>
#include <stack>

struct S1 { ~S1() { std::cout << "S1" << std::endl; } };
struct S2 { ~S2() { std::cout << "S2" << std::endl; } };

int main()
{
  std::stack<boost::shared_ptr<void> > s;
  {
    boost::shared_ptr<S1> p1(new S1);
    boost::shared_ptr<S2> p2(new S2);
    s.push(p1);
    s.push(p2);
    /// do something with p1 and p2
  }
  s.pop();
  s.pop();
  std::cout << "end" << std::endl;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.