C++中使用CRTP的模板化Singleton策略
Templated Singleton Policy using CRTP in C++
有很多人声称他们的单例实现是健壮和通用的,因为它使用元编程构造。
我的目标是对派生类强制执行singleton策略,这样我就不必显式(手动)将派生类的构造函数声明为private。我认为有一种方法可以天真地添加实例静态变量和getter作为策略,方法是使模板化的singleton成为派生类的朋友。但这一点都不优雅。
我从这段代码开始,它被认为是一个正确的(即完整的)单例设计,同时它显然允许多个实例:
template <class CWrappedClass>
class CSingleton
{
protected:
static CWrappedClass* ms_instance;
private:
CSingleton(){}
CSingleton(const CSingleton& ) {}
CSingleton& operator = (const CSingleton&) {}
public:
static CWrappedClass& GetInstance()
{
if (ms_instance == NULL)
ms_instance = new CWrappedClass;
return *ms_instance;
}
};
template <class CWrappedClass>
CWrappedClass* CSingleton<CWrappedClass>::ms_instance = NULL;
以及这个"策略"的单例客户端,使用CRTP:
class CThing : public CSingleton<CThing>
{
// friend class CSingleton<CThing>; // only if ctor is private!
public:
void DoNothing()
{
std::cout<<" Nothing n";
}
CThing()
{
std::cout<<" single ";
}
};
注意这不是CRTP Singleton策略的正确实施,这只是问题的一部分!
代码不会按原样编译。基本的singleton策略类的构造函数声明为private,因此它不能支持派生实例,除非子类是该类的朋友。人们通常会使构造函数受到保护,这意味着没有什么可以阻止用户使派生类成为非单重类。
问题:是否有任何机制可以在不必手动将派生类的构造函数设为私有的情况下强制执行单例策略?
如果您确实希望使用此模式:
-
模板的构造函数应该受到保护,而不是私有的,这样派生类就可以访问它。否则,它自己的构造函数就无法构造基类。
-
派生类可以使模板(它是它的基类)成为朋友,并拥有一个私有构造函数。
或者,您可以实现一个宏,该宏实际上是从编译单元中的派生类构造实例的。当我使用类似的模型时(强制修复使用singleton的代码,我无法更改,只能更改实际singleton的实现方式),我选择了这个选项,它实际上在其.cpp文件中通过了boost::once
构造。
相关文章:
- C++ Singleton - Prevent ::instance() to variable
- C++17中的并行执行策略
- 运行时执行策略不同
- 编译器上的策略数据结构不起作用
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 使用 Qt5 SQL 进行异步数据库访问的策略
- C++基于策略的设计:继承与组合
- Singleton ofstram:已创建但未写入的文件
- 当PSO细粒度策略对使用AdsGetObject MSDN API的Windows操作系统生效时,如何获取用户密码到期日
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- C++Singleton实例禁用重新调用
- 如何实例化基于输入的策略模式
- 没有从Singleton到嵌套Listener*的可行转换
- 使用策略模式设计软件时出现的问题
- 禁止复制构造函数和赋值运算符singleton类
- C++中使用CRTP的模板化Singleton策略