Макросы не предлагать.
Что лучше variant 1 или 2?
И вообще, что бы вы сказали увидев это в проекте?
class A
{
int m_n;
public:
A(int n) : m_n(n) {}
void f()
{
if ( 0 == m_n )
throw std::runtime_error("zero here");
std::cout << m_n << std::endl;
}
};
int main()
{
boost::shared_ptr< std::list<A> > pList(new std::list<A>);
pList->push_back(A(1));
pList->push_back(A(2));
pList->push_back(A(3));
pList->push_back(A(4));
pList->push_back(A(0));
pList->push_back(A(5));
void* pNull = NULL;
while(pList->size())
{
try
{
A& rA = pList->front();
//boost::shared_ptr< std::list<A> > OnExit(pList.get(), boost::mem_fn(&std::list<A>::pop_front)); // variant 1
boost::shared_ptr<void> OnExit(pNull, boost::bind(&std::list<A>::pop_front, pList)); // variant 2
rA.f();
}
catch(std::exception& e)
{
std::cout << "Error: " << e.what() << std::endl;
}
}
std::cout << "Press any key to exit..." << std::endl;
char ch = getch();
return 0;
}
);
pList-