单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
C++11之前,实现一个通用的泛型单例模式时,会遇到一个问题:这个泛型单例要能够创建所有的类型对象,但是这些类型的构造函数形参可能尽不相同,参数个数和参数类型可能都不相同,这导致我们不容易做一个所有类型都通用的单例。一种方法是通过定义一些创建单例的模板函数来实现。在一般情况下,类型的构造函数形参不超过6个,所以可以通过定义0~6个形参的创建单例的模板函数来实现一个通用的单例模式,代码如下所示:
从测试代码中可以看到,这个Singleton<T>可以创建大部分类型,支持不超过6个参数的类型。不过,从实现代码中可以看到,有很多重复的模板定义,这种定义繁琐而又重复,当参数超过6个时,我们不得不再增加模板定义。这种预先定义足够多的模板函数的方法显得重复又不够灵活。
C++11d可变参数模板正好可以消除这种重复,同时支持完美转发,即避免不必要的内存复制提高性能,又增加了灵活性。C++11实现的一个简洁通用的单例模式如下所示:
可以看到,C++11版本的通用单例模式的实现,没有了重复的模板定义,支持任意个数参数的类型创建,不用再担心模板函数定义得不够,还支持完美转发,无论是左值还是右值都能转发到正确的构造函数中,通过右值引用的移动语义还能进一步提高性能,简洁而优雅。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。