4.10.4 增强的uuid类
uuid类为了追求效率而没有提供构造函数,要生成一个UUID值必须要使用生成器。但有的时候这个操作步骤显得有些麻烦,因此我们可以从uuid类派生一个可以自动产生UUID值的增强类,以简化UUID的使用。
下面的代码实现了这个增强类uuid_t,它是uuid的子类,因而具有uuid的全部能力。它在内部定义了两个生成器的静态成员变量 ,分别用来产生随机UUID和字符串UUID,对应地也提供了两种重载形式的构造函数。对于Nil生成器,uuid_t使用带int参数的构造函数来调用实现,而名字生成器则使用了接受uuid和字符串参数的构造函数。
uuid_t还实现了两个类型转换操作符重载,可以隐式地转换成uuid对象,方便被应用在其他使用uuid类型的场景。
uuid_t的全部实现代码如下:
- using namespace boost::uuids;
- class uuid_t : public uuid
- {
- private:
- static random_generator rgen; //随机生成器
- static string_generator sgen; //字符串生成器
- public:
- uuid_t(): uuid(rgen()){} //缺省构造函数,生成随机UUID
- uuid_t(int): uuid(nil_uuid()){} //0值的UUID构造函数
- uuid_t(const char* str): uuid(sgen(str)) {} //字符串构造函数
- uuid_t(const uuid& u, const char* str): //名字生成器构造函数
- uuid(name_generator(u)(str)) {}
- explicit uuid_t(const uuid& u): uuid(u){} //拷贝构造函数
- operator uuid() //转换到uuid类型
- { return static_cast<uuid&>(*this); }
- operator uuid() const //常函数,转换到const uuid类型
- { return static_cast< const uuid&>(*this); }
- };
- random_generator uuid_t::rgen; //静态成员变量的定义
- string_generator uuid_t::sgen;
由于uuid_t类封装了uuid的所有生成器,故它比uuid用起来更加方便容易,例如:
- uuid_t u0 = 0; //0值的UUID
- assert(u0.is_nil());
-
- uuid_t u1,u2; //创建两个随机UUID值
- cout << u1 << endl;
- cout << u2 << endl;
-
- uuid_t u3("{01234567-89ab-cdef-0123-456789abcdef}"); //字符串构造
- cout << u3 << endl;
-
- cout << uuid_t(u3, "test name gen") << endl; //通过名字构造