c++ - 是否允许并接受用删除标记静态方法?
问题描述
假设所有业务对象都有一个接口被设计为隐藏实现。PIMPL 模式未使用。
class CNetworkManager : public IMyNetwork {...};
所有这些管理器都是单例,其方法如下:
网络管理器.h
CNetworkManager* CNetworkManager::getInstance();
CNetworkManager* CNetworkManager::destroy();
但是 NetworkManager.h 没有导出。因此静态方法在内部使用
NetworkManagerFactory.h
class CMyNetworkFactory
{
public:
static IMyNetwork* getInstance();
static void destroy();
};
网络管理器工厂.cpp
IMyNetwork* CMyNetworkFactory::getInstance()
{
return CNetworkManager::getInstance();
}
但是所有工厂都应该使用相同的命名。因此我添加了
模板 ISingletonFactory.h
template <class Factory, class Interface>
class CSingletonFactory
{
public:
~CSingletonFactory() {}
static Interface* getInstance() = delete;
static void destroy() = delete;
};
并将 NetworkManagerFactory.h 重新设计为 CRTP
class CMyNetworkFactory : public CSingletonFactory<CMyNetworkFactory, IMyNetwork>
{
public:
static IMyNetwork* getInstance();
static void destroy();
};
问题:静态和删除一起使用是坏的还是普通的艺术?
解决方案
静态和删除的使用是尽可能糟糕还是普通艺术?
= delete;
严格来说是一个函数定义。因此,任何功能都可以定义为已删除。函数是成员还是自由,静态与否,与删除的定义完全正交。
删除的结果是引用已删除函数的程序格式错误。推荐由重载决议确定。
所以是的,如果我们想禁止某事,删除定义是常见的做法。您似乎希望防止CMyNetworkFactory
在没有 . 的情况下定义类似的东西getInstance
。但后来我承认不明白为什么需要通过 CRTP 将任何内容定义为已删除。毕竟getInstance
,我认为无法完全找到名称查找与解析已删除的定义一样好。
推荐阅读
- javascript - 将标头数据存储在 url
- java - 使用java将过滤器应用于excel
- powershell - 如何在使用 powershell 转换、调整大小和移动图像时保持文件夹结构
- javascript - FabricJS中暂停后如何恢复动画
- xcode - 在 Xcode Builder for tvOS 中改变深色界面的按钮标题颜色
- c++ - 不确定如何使用 duration_cast 作为宏函数
- python-3.x - print() 命令不包含所有预期值
- macros - 如何在sql中获取char元素LIKE Array?
- java - 如何从 NSE Market Tracker 网页中提取文本?
- javascript - 如何修改 CalendarView minTime/maxTime/slotDuration?