Хочу решить задачу:
необходимо хранить указатели на объекты произвольных типов данных с возможностью удаления в порядке, обратном добавлению объектов.
в итоге соорудил следующий класс:
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
Здравствуйте, 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;
}