举个例子:
在使用一个共享互斥资源前我们要把资源使用的标志位设置为true,然后开始使用,使用完后要把标志位设置为false,让其它用户知道可以使用资源了,要实现这样的功能,传统的方式至少要两行代码! 如下:
bool mIsUsingFlag=false;
void Fun()
{
mIsUsingFlag=true;
//do something...
mIsUsingFlag=false;
}
有没有一行代码就可以完成这样的功能呢?
答案是:使用“退出即复位”的设置模式:
首先创建一个模板类:
template<typename T>
class ResetVariableOnExit
{
public:
/**
* 构造函数。
* @param variable 保存了原始值的变量。
*
* @param value 要设置的变量的新值
*/
ResetVariableOnExit(T& variable, const T& value) :
mVariable(variable),
mOriginalValue(variable)
{
mVariable = value; //将新值设置给变量
}
/**
* 恢复原始值
*/
ResetVariableOnExit()
{
mVariable = mOriginalValue;
}
private:
T& mVariable; //变量的引用
T mOriginalValue; //保存原始值
};
之后就可以像下面这样使用了:
bool mIsUsingFlag=false;
void Fun()
{
ResetVariableOnExit<bool> setter(mIsUsingFlag, true);
//do something...
}
这样就只要一行代码就实现上面的功能,而且不要担心忘记复位而带来的麻烦!