Meneruskan parameter ke API yang diproyeksikan
Untuk jenis tertentu, C++/WinRT menyediakan metode alternatif untuk meneruskan parameter ke API yang diproyeksikan. Kelas yang menerima parameter ini ditempatkan di namespace winrt::p aram . Hanya kode yang dihasilkan C++/WinRT yang harus menggunakan kelas ini; jangan gunakan dalam fungsi dan metode Anda sendiri.
Penting
Anda tidak boleh menggunakan jenis di namespace winrt::p aram sendiri. Mereka untuk kepentingan proyeksi.
Beberapa alternatif ini membedakan antara panggilan sinkron dan asinkron. Versi untuk panggilan asinkron biasanya mengambil kepemilikan data parameter untuk memastikan bahwa nilai tetap valid dan tidak berubah sampai panggilan asinkron selesai. Namun, perhatikan bahwa perlindungan ini tidak meluas ke perubahan pada koleksi dari utas lain. Mencegah itu adalah tanggung jawab Anda.
Alternatif untuk parameter string
winrt::p aram::hstring menyederhanakan parameter passing sebagai winrt::hstring. Selain winrt::hstring, alternatif ini juga diterima:
Alternatif | Catatan |
---|---|
{} |
Untai kosong. |
std::wstring_view | Tampilan harus diikuti oleh terminator null. |
std::wstring | |
wchar_t const* | String null-terminated. |
Anda tidak dapat meneruskan nullptr
untuk mewakili string kosong. Sebagai gantinya, gunakan L""
atau {}
.
Pengkompilasi tahu cara mengevaluasi literal string pada waktu kompilasi wcslen
. Jadi, untuk literal, L"Name"sv
dan L"Name"
setara.
Perhatikan bahwa objek std::wstring_view tidak dihentikan null, tetapi C++/WinRT mengharuskan karakter setelah akhir tampilan menjadi null. Jika Anda melewati std yang tidak dihentikan null::wstring_view, maka proses akan berakhir.
Alternatif untuk parameter yang dapat diulang
winrt::p aram::iterable T> and winrt::p aram::async_iterable<T> menyederhanakan parameter passing sebagai IIterable<T>.<
Windows Runtime koleksi IVector<T> dan IVectorView<T> sudah mendukung IIterable<T>. Windows Runtime koleksi IMap<K, V> dan IMapView<K, V> sudah mendukung IIterable<IKeyValuePair<K, V>>.
Selain IIterable<T>, alternatif berikut juga diterima. Perhatikan bahwa beberapa alternatif hanya tersedia untuk metode sinkron.
Alternatif | Sinkronisasi | Asinkron | Catatan |
---|---|---|---|
std::vector<T> const& | Ya | Tidak | |
std::vector<T>&& | Ya | Ya | Konten dipindahkan ke iterable sementara. |
std::initializer_list<T> | Ya | Ya | Versi asinkron menyalin item. |
std::initializer_list<U> | Ya | Tidak | U harus dapat dikonversi ke T. |
{ begin, end } |
Ya | Tidak | begin dan end harus meneruskan iterator, dan *begin harus dapat dikonversi ke T. |
Iterator ganda bekerja lebih umum untuk kasus di mana Anda memiliki koleksi yang tidak sesuai dengan salah satu skenario di atas, selama Anda dapat melakukan iterasi di atasnya dan menghasilkan hal-hal yang dapat dikonversi ke T. Misalnya, Anda mungkin memiliki IVector<U> atau std::vector<U>, di mana U dapat dikonversi ke T.
Dalam contoh berikut, metode SetStorageItems mengharapkan IStorageItem> yang Dapat<Diubah. Pola perulangan ganda memungkinkan kita melewati jenis koleksi lainnya.
// 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
Untuk kasus IKeyValuePair<K IIterable<, V>>, alternatif berikut diterima. Perhatikan bahwa beberapa alternatif hanya tersedia untuk metode sinkron.
Alternatif | Sinkronisasi | Asinkron | Catatan |
---|---|---|---|
std::map<K, V> const& | Ya | Tidak | |
std::map<K, V>&& & | Ya | Ya | Konten dipindahkan ke iterable sementara. |
std::unordered_map<K, V> const& | Ya | Tidak | |
std::unordered_map<K, V>&& & | Ya | Ya | Konten dipindahkan ke iterable sementara. |
std::initializer_list<std::p air<K, V>> | Ya | Ya | Versi asinkron menyalin daftar ke dalam iterable sementara. |
{ begin, end } |
Ya | Tidak | begin dan end harus meneruskan iterator, dan begin->first dan begin->second harus dikonversi ke K dan V, masing-masing. |
Alternatif untuk parameter tampilan vektor
winrt::p aram::vector_view T> dan winrt::p aram::async_vector_view<T> menyederhanakan parameter passing sebagai IVectorView<T>.<
Anda dapat memanggil IVector<T>::GetView untuk mendapatkan IVectorView<T> dari IVector<T>.
Selain IVectorView<T>, alternatif berikut juga diterima. Perhatikan bahwa beberapa alternatif hanya tersedia untuk metode sinkron.
Alternatif | Sinkronisasi | Asinkron | Catatan |
---|---|---|---|
std::vector<T> const& | Ya | Tidak | |
std::vector<T>&& | Ya | Ya | Isi dipindahkan ke tampilan sementara. |
std::initializer_list<T> | Ya | Ya | Versi asinkron menyalin daftar ke dalam tampilan sementara. |
{ begin, end } |
Ya | Tidak | begin dan end harus meneruskan iterator, dan *begin harus dapat dikonversi ke T. |
Sekali lagi, versi iterator ganda dapat digunakan untuk membuat tampilan vektor dari hal-hal yang tidak sesuai dengan alternatif yang ada.
Tampilan sementara lebih efisien jika begin
iterator dan end
iterator adalah iterator akses acak.
Alternatif untuk parameter tampilan peta
winrt::p aram::map_view T> dan winrt::p aram::async_map_view<T> menyederhanakan parameter yang diteruskan sebagai IMapView<T>.<
Anda dapat memanggil IMap<K, V>::GetView untuk mendapatkan IMapView<K, V> dari IMap<K, V>.
Selain IMapView<K, V>, alternatif berikut juga diterima. Perhatikan bahwa beberapa alternatif hanya tersedia untuk metode sinkron.
Alternatif | Sinkronisasi | Asinkron | Catatan |
---|---|---|---|
std::map<K, V> const& | Ya | Tidak | |
std::map<K, V>&& & | Ya | Ya | Isi dipindahkan ke tampilan sementara. |
std::unordered_map<K, V> const& | Ya | Tidak | |
std::unordered_map<K, V>&& & | Ya | Ya | Isi dipindahkan ke tampilan sementara. |
std::initializer_list<std::p air<K, V>> | Ya | Ya | Isi disalin ke dalam tampilan sementara. Kunci mungkin tidak diduplikasi. |
Alternatif untuk parameter vektor
winrt::p aram::vector<T> menyederhanakan parameter passing sebagai IVector<T>. Selain IVector<T>, alternatif ini juga diterima:
Alternatif | Catatan |
---|---|
std::vector<T>&& | Konten dipindahkan ke vektor sementara. Hasil tidak dipindahkan kembali. |
std::initializer_list<T> |
Jika metode mengubah vektor sementara, maka perubahan tersebut tidak tercermin dalam parameter asli. Untuk mengamati perubahan, lewati IVector<T>.
Alternatif untuk parameter peta
winrt::p aram::map<K, V> menyederhanakan parameter passing sebagai IMap<K, V>. Selain IMap<K, V>, alternatif ini juga diterima:
Anda dapat lulus | Catatan |
---|---|
std::map<K, V>&& & | Isi dipindahkan ke peta sementara. Hasil tidak dipindahkan kembali. |
std::unordered_map<K, V>&& & | Isi dipindahkan ke peta sementara. Hasil tidak dipindahkan kembali. |
std::initializer_list<std::p air<K, V>> |
Jika metode mengubah peta sementara, maka perubahan tersebut tidak tercermin dalam parameter asli. Untuk mengamati perubahan, lewati IMap<K, V>.
Alternatif untuk parameter array
winrt::array_view<T> tidak ada di namespace winrt::p aram , tetapi digunakan untuk parameter yang merupakan array gaya C. Selain array_view<T> yang eksplisit, alternatif ini juga diterima:
Alternatif | Catatan |
---|---|
{} |
Array kosong. |
U[] | Array gaya C, di mana U dapat dikonversi ke T, dan sizeof(U) == sizeof(T) . |
std::array<U, N> | Di mana U dapat dikonversi ke T, dan sizeof(U) == sizeof(T) . |
std::vector<U> | Di mana U dapat dikonversi ke T, dan sizeof(U) == sizeof(T) . |
{ begin, end } |
begin dan end harus berjenis T*, mewakili rentang [begin , end ). |
std::initializer_list<T> | |
std::span<U, N> | Di mana U dapat dikonversi ke T, dan sizeof(U) == sizeof(T) . |
Lihat juga posting blog Berbagai pola untuk melewati array gaya C di seluruh batas Windows Runtime ABI.