从指针转换为引用

Cast from pointer to reference

我有一个通用的单例 class,我将用于许多单例 class。当从指针转换为引用时,泛型 class 会出现编译错误。

Error 3 error C2440: 'static_cast' : cannot convert from 'IApp *' to 'IApp &'

下面是泛型class,编译错误发生在instance()函数中。

template<typename DERIVED>
class Singleton
{
public:

    static DERIVED& instance()
    {
        if (!_instance) {
            _instance = new DERIVED;
            std::atexit(_singleton_deleter); // Destruction of instance registered at runtime exit (No leak).
        }

        return static_cast<DERIVED&>(_instance);
    }

protected:

    Singleton() {}
    virtual ~Singleton() {}

private:

    static DERIVED* _instance;

    static void _singleton_deleter() { delete _instance; } //Function that manages the destruction of the instance at the end of the execution.

};

这样可以投吗?我不想要 instance() 到 return 一个指针,我更喜欢一个参考。或者 weak_ptr?知道如何投射这个吗?

您正在寻找的是使用间接运算符 * 对指针进行 取消引用 。你想要

return static_cast<DERIVED&>(*_instance);
//                         ^^^^^

return *static_cast<DERIVED*>(_instance);
//   ^^^^^

或简单地:

return *_instance;
//   ^^^^^

因为 _instance 已经 有类型 Derived * 并且上面的两个转换是空操作。