首页 > 解决方案 > 是否允许并接受用删除标记静态方法?

问题描述

假设所有业务对象都有一个接口被设计为隐藏实现。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();
};

问题:静态和删除一起使用是坏的还是普通的艺术?

标签: c++staticcrtp

解决方案


静态和删除的使用是尽可能糟糕还是普通艺术?

= delete;严格来说是一个函数定义。因此,任何功能都可以定义为已删除。函数是成员还是自由,静态与否,与删除的定义完全正交。

删除的结果是引用已删除函数的程序格式错误。推荐由重载决议确定。

所以是的,如果我们想禁止某事,删除定义是常见的做法。您似乎希望防止CMyNetworkFactory在没有 . 的情况下定义类似的东西getInstance。但后来我承认不明白为什么需要通过 CRTP 将任何内容定义为已删除。毕竟getInstance,我认为无法完全找到名称查找与解析已删除的定义一样好。


推荐阅读