class AtExitBase{
public:
virtual ~AtExitBase(){}
};
template<typename OBJ,typename T,T(*FINI)(OBJ*obj)>
class AtExit : public AtExitBase{
public:
AtExit(OBJ* ptr):m_ptr_(ptr){}
virtual ~AtExit(){
if(m_ptr_)
FINI(m_ptr_);
}
private:
OBJ* m_ptr_;
};
class AtExitMng{
typedef std::vector<AtExitBase*> AtExitVector;
typedef AtExitVector::reverse_iterator Iter;
public:
~AtExitMng(){
for(Iter iter = m_vector_.rbegin();
iter != m_vector_.rend();
++ iter)
{
delete *iter;
}
}
template<typename OBJ,typename T,T(*FINI)(OBJ*obj)>
void Push(OBJ* ptr){
AtExit<OBJ,T,FINI> *ptr_ = new AtExit<OBJ,T,FINI>(ptr);
assert(ptr_);
m_vector_.push_back(ptr_);
}
private:
AtExitVector m_vector_;
};
#include <cstdio>
#include <cstdlib>
int test(double * x){
printf("FUNC:%s\n",__FUNCTION__);
return 0;
}
int main(){
double a = 0.0;
AtExitMng mng_;
mng_.Push<double,int,test>(&a);
return 0;
}