Passage de paramètres aux API projetées

Pour certains types, C++/WinRT fournit d’autres méthodes pour transmettre un paramètre à une API projetée. Ces classes acceptant les paramètres sont placées dans l’espace de noms winrt ::p aram . Seul le code généré par C++/WinRT doit utiliser ces classes ; ne les utilisez pas dans vos propres fonctions et méthodes.

Important

Vous ne devez pas utiliser vous-même les types de l’espace de noms winrt::param. Ils sont à l’avantage de la projection.

Certaines de ces alternatives font la distinction entre les appels synchrones et asynchrones. La version des appels asynchrones prend généralement la propriété des données de paramètre pour s’assurer que les valeurs restent valides et inchangées tant que l’appel asynchrone n’est pas terminé. Notez toutefois que cette protection ne s’étend pas aux modifications apportées à la collection à partir d’un autre thread. Empêcher cela est votre responsabilité.

Alternatives pour les paramètres de chaîne

winrt::param::hstring simplifie le passage de paramètres sous forme de winrt::hstring. En plus de winrt ::hstring, ces alternatives sont également acceptées :

Alternatif Notes
{} Chaîne vide.
std ::wstring_view La vue doit être suivie d’un terminateur nul.
std ::wstring
wchar_t const* Chaîne terminée par un caractère nul.

Vous ne pouvez pas passer nullptr pour représenter la chaîne vide. À la place, utilisez L"" ou {}.

Le compilateur sait comment évaluer wcslen sur les littéraux de chaîne au moment de la compilation. Ainsi, pour les littéraux, L"Name"sv et L"Name" sont équivalents.

Notez que les objets std::wstring_view ne sont pas terminés par un caractère nul, mais C++/WinRT exige que le caractère suivant la fin de cette vue soit nul. Si vous passez un std::wstring_view non terminé par un caractère nul, le processus s’arrêtera.

Alternatives pour les paramètres itérables

winrt::param::iterable<T> et winrt::param::async_iterable<T> simplifient le passage de paramètres sous forme de IIterable<T>.

Les collections Windows Runtime IVector<T> et IVectorView<T> prennent déjà en charge IIterable<T>. Les collections Windows Runtime IMap<K, V> et IMapView<K, V> prennent déjà en charge IIterable<IKeyValuePair<K, V>>.

Outre IIterable<T>, les alternatives suivantes sont également acceptées. Notez que certaines alternatives sont disponibles uniquement pour les méthodes synchrones.

Alternatif Sync Asynchrone Notes
std::vector<T> const& Yes No
std::vector<T>&& Yes Yes Les contenus sont déplacés dans un itérable temporaire.
std::initializer_list<T> Yes Yes La version asynchrone copie les éléments.
std::initializer_list<U> Yes No U doit être convertible en T.
{ begin, end } Yes No begin et end doivent être des itérateurs forward, et *begin doit être convertible en T.

L’itérateur double fonctionne plus généralement pour le cas où vous disposez d’une collection qui ne correspond à aucun des scénarios ci-dessus, tant que vous pouvez itérer dessus et produire des éléments qui peuvent être convertis en T. Par exemple, vous pouvez avoir un IVector<U> ou std ::vector<U>, où U est convertible en T.

Dans l’exemple suivant, la méthode SetStorageItems attend un IIterable<IStorageItem>. Le motif du double itérateur nous permet de passer d’autres types de collections.

// 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

Pour le cas d’IIterable<IKeyValuePair<K, V>>, les alternatives suivantes sont acceptées. Notez que certaines alternatives sont disponibles uniquement pour les méthodes synchrones.

Alternatif Sync Asynchrone Notes
std::map<K, V> const& Yes No
std::map<K, V>&& Yes Yes Les éléments sont déplacés vers un objet itérable temporaire.
std::unordered_map<K, V> const& Yes No
std::unordered_map<K, V>&& Yes Yes Le contenu est déplacé dans un objet itérable temporaire.
std::initializer_list<std::pair<K, V>> Yes Yes La version asynchrone copie la liste dans un objet itérable temporaire.
{ begin, end } Yes No begin et end doivent être des itérateurs avant, et begin->first et begin->second doivent être convertibles en K et V, respectivement.

Alternatives pour les paramètres de vue vectorielle

winrt ::p aram ::vector_view<T> et winrt ::p aram ::async_vector_view<T> simplifient le passage de paramètres en tant que IVectorView<T>.

Vous pouvez appeler IVector<T> ::GetView pour obtenir un IVectorView<T> à partir d’un IVector<T>.

Outre IVectorView<T>, les alternatives suivantes sont également acceptées. Notez que certaines alternatives sont disponibles uniquement pour les méthodes synchrones.

Alternatif Sync Asynchrone Notes
std::vector<T> const& Yes No
std::vector<T>&& Yes Yes Le contenu est déplacé dans une vue temporaire.
std::initializer_list<T> Yes Yes La version asynchrone copie la liste dans un affichage temporaire.
{ begin, end } Yes No begin et end doivent être des itérateurs forward, et *begin doit être convertible en T.

Là encore, la version à deux itérateurs peut être utilisée pour créer des vues de vecteur à partir d’éléments qui ne correspondent à aucune solution existante. La vue temporaire est plus efficace si les itérateurs begin et end sont des itérateurs à accès aléatoire.

Alternatives pour les paramètres d’affichage cartographique

winrt::param::map_view<T> et winrt::param::async_map_view<T> simplifient le passage de paramètres sous forme de IMapView<T>.

Vous pouvez appeler IMap<K, V>::GetView pour obtenir un IMapView<K, V> à partir d’un IMap<K, V>.

Outre IMapView<K, V>, les alternatives suivantes sont également acceptées. Notez que certaines alternatives sont disponibles uniquement pour les méthodes synchrones.

Alternatif Sync Asynchrone Notes
std::map<K, V> const& Yes No
std::map<K, V>&& Yes Yes Le contenu est déplacé dans une vue temporaire.
std::unordered_map<K, V> const& Yes No
std::unordered_map<K, V>&& Yes Yes Le contenu est déplacé dans une vue temporaire.
std::initializer_list<std::pair<K, V>> Yes Yes Le contenu est copié dans une vue temporaire. Les clés peuvent ne pas être dupliquées.

Alternatives pour les paramètres de vecteur

winrt::param::vector<T> simplifie le passage de paramètres sous la forme de IVector<T>. Outre IVector<T>, ces alternatives sont également acceptées :

Alternatif Notes
std::vector<T>&& Le contenu est déplacé dans un vecteur temporaire. Les résultats ne sont pas déplacés.
std::initializer_list<T>

Si la méthode mute le vecteur temporaire, ces modifications ne sont pas reflétées dans les paramètres d’origine. Pour observer les modifications, passez un IVector<T>.

Alternatives pour les paramètres de carte

winrt::param::map<K, V> simplifie le passage de paramètres sous forme de IMap<K, V>. Outre IMap<K, V>, ces alternatives sont également acceptées :

Vous pouvez passer Notes
std::map<K, V>&& Le contenu est déplacé dans une carte temporaire. Les résultats ne sont pas replacés.
std::unordered_map<K, V>&& Le contenu est déplacé dans une carte temporaire. Les résultats ne sont pas déplacés.
std::initializer_list<std::pair<K, V>>

Si la méthode mute la carte temporaire, ces modifications ne sont pas reflétées dans les paramètres d’origine. Pour observer les modifications, passez un IMap<K, V>.

Alternatives pour les paramètres de tableau

winrt ::array_view<T> n’est pas dans l’espace de noms winrt ::p aram , mais il est utilisé pour les paramètres qui sont des tableaux de style C. En plus d’un array_view<T> explicite, ces alternatives sont également acceptées :

Alternatif Notes
{} Tableau vide.
U[] Tableau de style C, où U est convertible en T, et sizeof(U) == sizeof(T).
std ::array<U, N> U est convertible en T, et sizeof(U) == sizeof(T).
std ::vector<U> U est convertible en T, et sizeof(U) == sizeof(T).
{ begin, end } begin et end doit être de type T*, représentant la plage [begin, end).
std::initializer_list<T>
std ::span<U, N> U est convertible en T, et sizeof(U) == sizeof(T).

Consultez également le billet de blog Les différents modèles pour passer des tableaux de style C à travers la limite Windows Runtime ABI.