Официально это не поддерживается, поскольку класс DeviceInformationCollection не предоставляет способ создания пустого экземпляра самого себя.Если вы не можете найти какую-либо функцию в API Windows.Devices.Enumeration, которая делает это для вас, вам не повезло.
Неофициально мы можем заметить, что интерфейсом по умолчанию для класса DeviceInformationCollection является IVectorView.Это означает, что этот интерфейс представляет класс в ABI.Таким образом, вы можете поиграть с этими знаниями, но в целом это очень опасно, потому что API, которые принимают DeviceInformationCollection в качестве входных данных, могут предполагать, что его реализация является эксклюзивной, и, таким образом, полагаться на некоторую внутреннюю разметку, о которой вы можете не знать.Лучше каждый раз возвращать IVectorView полиморфным и безопасным способом.Как то так:
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::Devices::Enumeration;
IAsyncOperation<IVectorView<DeviceInformation>> Async()
{
DeviceInformationCollection devices = co_await // ... some async call
if (devices)
{
co_return devices;
}
// Returns empty IVectorView...
co_return single_threaded_observable_vector<DeviceInformation>().GetView();
}
int main()
{
for (auto&& device : Async().get())
{
printf("%ls\n", device.Name().c_str());
}
}