补充一个类模板:ScopedValueSetter

ScopedValueSetter类模板基于RAII技术,可在作用域范围内临时修改某个变量或对象的值,离开此作用域后,该变量或对象恢复原值,或者自动成为另一个值。该类模板有两个构造函数,其用法见示例:

int x = 1;	// x的原值为1
{
    // 进入作用域. 创建本类对象,将x的值临时设置为2
    ScopedValueSetter setter (x, 2);

    // x的值已变成2...
}

// 离开作用域后,x恢复为原值1。而后再次进入新的作用域
{	 
    // 创建本类对象,将x的值设置为3,离开此作用域后,让该值变成4
    ScopedValueSetter setter (x, 3, 4);	

    // x的当前值为3, 离开此作用域后, 值为4...
 }

 // x的值为4...

关于RAII:Resource Acquisition Is Initialization,资源获取即初始化(以初始化的方式获取资源)。即:使用对象来代表或管理资源,利用C++对象生命期的概念控制资源的获取和释放,将资源的生命期和对象的生命期紧密关联到一起。如需要某种资源(内存、缓冲区、文件句柄、网络连接等等),则创建一个代表该资源的RAII类的对象即可。步骤有三:

  • 自定义类,代表所要管理的资源。
  • 自定义基于RAII技术的类,负责管理资源类的对象(指针)。
  • 使用时,创建RAII类的栈对象。

JUCE类库中,多线程环境下使用很频繁的ScopedLock(作用域锁)也是基于RAII技术实现其功能的。