利用RAII需要创建一个类,以便从退出作用域时自动调用自动变量的析构函数的机制中受益。
然而,在某些情况下,为了#34;发布"某些东西或未设置的东西似乎太多了。
例如,如果你有一个方法只在呼叫期间设置一个字段的值,那么你必须在调用返回或抛出时手动取消设置它,并且它不实用,直观地编写一个只会自动取消设置该字段的类,并且只能用于这种特殊情况。
所以我考虑过编写某种通用类,它可以在所有不值得上课的情况下使用RAII。
我们的想法是提供一个对象实例,一个在构造时调用的方法指针,以及一个在销毁时调用的方法指针:
template< class T >
class guard
{
private:
T * const m_pInstance;
void (T::* const m_fnInitialize)();
void (T::* const m_fnFinalize)() throw();
public:
guard( T * pInstance, void (T::* fnInitialize)(), void (T::* fnFinalize)() throw() ) :
m_pInstance ( pInstance ),
m_fnInitialize ( fnInitialize ),
m_fnFinalize ( fnFinalize )
{
(m_pInstance->*m_fnInitialize)();
}
~guard() throw()
{
(m_pInstance->*m_fnFinalize)();
}
};
可以这样使用:
class some_class
{
private:
int m_iField;
public:
some_class() : m_iField( 0 )
{
}
void set()
{
std::cout << "set()" << std::endl;
m_iField = 1;
}
void unset() throw()
{
std::cout << "unset()" << std::endl;
m_iField = 0;
}
};
int main( int argc, char ** argv )
{
some_class oObj;
{
core::guard< some_class > oGuard( & oObj, & some_class::set, & some_class::unset );
}
system( "pause" );
return 0;
}
它让我觉得它很方便。但是你知道为什么这会是一种不好的做法吗?
我设计的方式也不完全是&#34;泛型&#34;因为它带来了一些约束:初始化和终结方法是非const的,并且终结方法可能不会抛出。有没有办法让这更灵活?
谢谢。