我如何在使用 winrt::static_lifetime 时获取 class 的实例?

How do i get the Instance of the class when i use winrt::static_lifetime?

我不久前从 C++/CX 切换到 C++/winrt,目前我卡住了,因为我想创建一个单例 winrt-class。我阅读了有关 winrt::static_lifetime (https://docs.microsoft.com/en-us/uwp/cpp-ref-for-winrt/static-lifetime) 的信息,但他们没有提供任何有关如何使用它的代码示例。 所以我的问题是如何用这个获得 class 的实例?

提前感谢您的帮助。

winrt::static_lifetime 指定工厂是单例,因此您基本上需要将单例实例实现为(现在是单例)工厂的 属性。

即:

namespace Foo::implementation {
    struct Foo : FooT<Foo> {
        Foo() {
        }

        static Foo Singleton() {
            auto fooFactory = winrt::make<factory_implementation::Foo>();
            return fooFactory->Singleton();
        }
    };
}

namespace Foo::factory_implementation {
    // specifies the factory is a singleton
    struct Foo : FooT<Foo, implementation::Foo, winrt::static_lifetime> 
    {
        Foo Singleton() {
            slim_lock_guard lock{ m_lock };
            if (!m_singleton) {
                m_singleton = winrt::make<Foo>();
            }
            return m_singleton;
        }

    private:
        winrt::slim_mutex m_lock;
        Foo m_singleton;
    };
}

那么为什么与类似的东西相比,这个更受欢迎:

static Foo Singleton() {
    static auto single = winrt::make<Foo>();
    return single;
}

之所以这样做是因为在RoUninitialize之后进程静态可能会被破坏导致崩溃。 winrt::static_lifetime 基本上将工厂放入 CoreApplication.Properties,它在进程执行 RoUninitialize 之前安全未初始化。这基本上与过去需要避免将遗留 COM 对象存储到进程全局变量中的原因相同。