gpt4 book ai didi

c++-winrt - 使用 winrt::static_lifetime 时如何获取类的实例?

转载 作者:行者123 更新时间:2023-12-05 03:01:05 26 4
gpt4 key购买 nike

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

提前感谢您的帮助。

最佳答案

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 对象存储到进程全局变量中的原因相同。

关于c++-winrt - 使用 winrt::static_lifetime 时如何获取类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com