Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
För vissa typer tillhandahåller C++/WinRT alternativa metoder för att skicka en parameter till ett beräknat API. Dessa parameterbetagande klasser placeras i namnområdet winrt::p aram . Endast C++/WinRT-genererad kod bör använda dessa klasser. använd dem inte i dina egna funktioner och metoder.
Viktigt!
Du bör inte använda typerna i winrt::param namnutrymme själv. De är för att gynna projektionen.
Några av dessa alternativ skiljer mellan synkrona och asynkrona anrop. Versionen för asynkrona anrop tar vanligtvis ägarskap för parameterdata för att säkerställa att värdena förblir giltiga och oförändrade tills det asynkrona anropet har slutförts. Observera dock att det här skyddet inte omfattar ändringar i samlingen från en annan tråd. Att förhindra det är ditt ansvar.
Alternativ för strängparametrar
winrt::p aram::hstring förenklar överföring av parametrar som winrt::hstring. Förutom winrt::hstring accepteras även dessa alternativ:
Alternativ | Noteringar |
---|---|
{} |
En tom sträng. |
std::wstring_view | Vyn måste följas av en nollterminator. |
std::wstring | |
wchar_t const* | En nollterminerad sträng. |
Du kan inte skicka nullptr
för att representera den tomma strängen. Använd L""
i stället eller {}
.
Kompilatorn vet hur man ska utvärdera wcslen
på strängliteraler under kompileringen. Så för literaler L"Name"sv
och L"Name"
är likvärdiga.
Observera att std::wstring_view objekt inte är null-avslutade, men C++/WinRT kräver att tecknet efter vyns slut är null. Om du skickar en std::wstring_viewsom inte avslutas med null, kommer processen att avslutas.
Alternativ för itererbara parametrar
winrt::param::iterable<T> och winrt::param::async_iterable<T> förenklar att skicka parametrar som IIterable<T>.
Windows Runtime-samlingarna IVector<T> och IVectorView<T> stöder redan IIterable<T>. Windows Runtime-samlingarna IMap<K, V> och IMapView<K, V> stöder redan IIterable<IKeyValuePair<K, V>>.
Förutom IIterable<T> accepteras även följande alternativ. Observera att vissa alternativ endast är tillgängliga för synkrona metoder.
Alternativ | Synkronisering | Asynkron | Noteringar |
---|---|---|---|
std::vector<T> const& | Ja | Nej | |
std::vector<T>&& | Ja | Ja | Innehållet flyttas till en tillfällig iterbar fil. |
std::initializer_list<T> | Ja | Ja | Async-versionen kopierar elementen. |
std::initializer_list<U> | Ja | Nej | U måste konverteras till T. |
{ begin, end } |
Ja | Nej |
begin och end måste vara vidarebefordrande iteratorer, och *begin måste vara konvertibla till T. |
Dubbel-iteratorn fungerar mer allmänt för det fall där du har en samling som inte passar något av scenarierna ovan, så länge du kan iterera över den och producera saker som kan konverteras till T. Du kan till exempel ha en IVector<U> eller std::vector<U>, där U kan konverteras till T.
I följande exempel förväntar sig metoden SetStorageItems en IIterable<IStorageItem>. Med dubbel iteratormönstret kan vi skicka andra typer av samlingar.
// IVector of derived types.
winrt::Windows::Foundation::Collections::IVector<winrt::Windows::Storage::StorageFile>
storageFiles{ /* initialization elided */ };
dataPackage.SetStorageItems(storageFiles); // doesn't work
dataPackage.SetStorageItems({ storageFiles.begin(), storageFiles.end() }); // works
// Array of derived types.
std::array<winrt::Windows::Storage::StorageFile, 3>
storageFiles{ /* initialization elided */ };
dataPackage.SetStorageItems(storageFiles); // doesn't work
dataPackage.SetStorageItems({ storageFiles.begin(), storageFiles.end() }); // works
För IIterable<IKeyValuePair<K, V>> godkänns följande alternativ. Observera att vissa alternativ endast är tillgängliga för synkrona metoder.
Alternativ | Synkronisering | Asynkron | Noteringar |
---|---|---|---|
std::map<K, V> const& | Ja | Nej | |
std::map<K, V>&& | Ja | Ja | Innehållet flyttas till en tillfällig iterbar fil. |
std::unordered_map<K, V> const& | Ja | Nej | |
std::unordered_map<K, V>&& | Ja | Ja | Innehållet flyttas till en tillfällig iterbar fil. |
std::initializer_list<std::p air<K, V>> | Ja | Ja | Async-versionen kopierar listan till en tillfällig iterbar version. |
{ begin, end } |
Ja | Nej |
begin och end måste vara vidarebefordrande iteratorer och begin->first begin->second måste vara konvertibla till K respektive V. |
Alternativ för vektorvyparametrar
winrt::p aram::vector_view<T> och winrt::p aram::async_vector_view<T> förenklar överföringsparametrar som IVectorView<T>.
Du kan anropa IVector<T>::GetView för att hämta en IVectorView<T> från en IVector<T>.
Förutom IVectorView<T> godkänns även följande alternativ. Observera att vissa alternativ endast är tillgängliga för synkrona metoder.
Alternativ | Synkronisering | Asynkron | Noteringar |
---|---|---|---|
std::vector<T> const& | Ja | Nej | |
std::vector<T>&& | Ja | Ja | Innehållet flyttas till en tillfällig vy. |
std::initializer_list<T> | Ja | Ja | Async-versionen kopierar listan till en tillfällig vy. |
{ begin, end } |
Ja | Nej |
begin och end måste vara vidarebefordrande iteratorer, och *begin måste vara konvertibla till T. |
Återigen kan dubbel iteratorversionen användas för att skapa vektorvyer av saker som inte passar ett befintligt alternativ.
Den tillfälliga vyn är effektivare om begin
iteratorerna och end
är iteratorer med slumpmässig åtkomst.
Alternativ för kartvyparametrar
winrt::p aram::map_view<T> och winrt::p aram::async_map_view<T> förenklar överföring av parametrar som IMapView<T>.
Du kan anropa IMap<K, V>::GetView för att hämta en IMapView<K, V> från en IMap<K, V>.
Förutom IMapView<K, V>, accepteras även följande alternativ. Observera att vissa alternativ endast är tillgängliga för synkrona metoder.
Alternativ | Synkronisering | Asynkron | Noteringar |
---|---|---|---|
std::map<K, V> const& | Ja | Nej | |
std::map<K, V>&& | Ja | Ja | Innehållet flyttas till en tillfällig vy. |
std::unordered_map<K, V> const& | Ja | Nej | |
std::unordered_map<K, V>&& | Ja | Ja | Innehållet flyttas till en tillfällig vy. |
std::initializer_list<std::p air<K, V>> | Ja | Ja | Innehållet kopieras till en tillfällig vy. Det är förbjudet att kopiera nycklar. |
Alternativ för vektorparametrar
winrt::param::vector<T> förenklar att skicka parametrar i form av IVector<T>. Förutom IVector<T> accepteras även dessa alternativ:
Alternativ | Noteringar |
---|---|
std::vector<T>&& | Innehållet flyttas till en tillfällig vektor. Resultaten flyttas inte tillbaka. |
std::initializer_list<T> |
Om metoden muterar den tillfälliga vektorn återspeglas inte dessa ändringar i de ursprungliga parametrarna. Om du vill observera ändringarna skickar du en IVector<T>.
Alternativ för kartparametrar
winrt::param::map<K, V> förenklar att skicka parametrar som IMap<K, V>. Förutom IMap<K, V>, accepteras även dessa alternativ:
Du kan passera | Noteringar |
---|---|
std::map<K, V>&& | Innehållet flyttas till en tillfällig karta. Resultaten flyttas inte tillbaka. |
std::unordered_map<K, V>&& | Innehållet flyttas till en tillfällig karta. Resultaten flyttas inte tillbaka. |
std::initializer_list<std::p air<K, V>> |
Om metoden muterar den tillfälliga kartan återspeglas inte dessa ändringar i de ursprungliga parametrarna. Om du vill observera ändringarna skickar du en IMap<K, V>.
Alternativ för matrisparametrar
winrt::array_view<T> finns inte i namnområdet winrt::p aram , men det används för parametrar som är C-formatmatriser. Förutom en explicit array_view<T> godkänns även dessa alternativ:
Alternativ | Noteringar |
---|---|
{} |
Tomt fält. |
U[] | En matris i C-stil, där U är konvertibelt till T och sizeof(U) == sizeof(T) . |
std::array<U, N> | Där U är konvertibelt till T och sizeof(U) == sizeof(T) . |
std::vector<U> | Där U är konvertibelt till T och sizeof(U) == sizeof(T) . |
{ begin, end } |
begin och end måste vara av typen T*, som representerar intervallet [begin , end ). |
std::initializer_list<T> | |
std::span<U, N> | Där U är konvertibelt till T och sizeof(U) == sizeof(T) . |
Se även blogginlägget De olika mönstren för att skicka C-formatmatriser över Windows Runtime ABI-gränsen.