標準的な C++ のデータ型と C++/WinRTStandard C++ data types and C++/WinRT

C +/cli WinRT、C++ 標準ライブラリの一部のデータ型を含む標準 C++ データ型を使用して Windows ランタイム Api を呼び出すことができます。With C++/WinRT, you can call Windows Runtime APIs using Standard C++ data types, including some C++ Standard Library data types. 標準文字列を Api に渡すことができます (を参照してください文字列 c++ 処理/cli WinRT)、初期化子リストと標準のコンテナーに渡せる意味的に同等のコレクションを期待する Api とします。You can pass standard strings to APIs (see String handling in C++/WinRT), and you can pass initializer lists and standard containers to APIs that expect a semantically equivalent collection.

標準的な初期化子リストStandard initializer lists

初期化子リスト (std::initializer_list) は、C++ 標準ライブラリのコンストラクトです。An initializer list (std::initializer_list) is a C++ Standard Library construct. Windows ランタイムの特定のコンストラクターやメソッドを呼び出すときに初期化子リストを使用することができます。You can use initializer lists when you call certain Windows Runtime constructors and methods. たとえば、DataWriter::WriteBytes を呼び出すことができます。For example, you can call DataWriter::WriteBytes with one.

#include <winrt/Windows.Storage.Streams.h>

using namespace winrt::Windows::Storage::Streams;

int main()
{
    winrt::init_apartment();

    InMemoryRandomAccessStream stream;
    DataWriter dataWriter{stream};
    dataWriter.WriteBytes({ 99, 98, 97 }); // the initializer list is converted to a winrt::array_view before being passed to WriteBytes.
}

この作業には 2 つの部分が含まれています。There are two pieces involved in making this work. 最初に、DataWriter::WriteBytes メソッドは型が winrt::array_view であるパラメーターを受け取ります。First, the DataWriter::WriteBytes method takes a parameter of type winrt::array_view.

void WriteBytes(winrt::array_view<uint8_t const> value) const

winrt::array_viewカスタムC++を安全に連続した一連の値を表す/WinRT 型 (で定義されている、C++は/WinRT 基本ライブラリ%WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h)。winrt::array_view is a custom C++/WinRT type that safely represents a contiguous series of values (it is defined in the C++/WinRT base library, which is %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h).

2 番目、 winrt::array_view初期化子リスト コンストラクターがあります。Second, winrt::array_view has an initializer-list constructor.

template <typename T> winrt::array_view(std::initializer_list<T> value) noexcept

多くの場合、注意すべきかどうかを選択できますwinrt::array_viewプログラミングにします。In many cases, you can choose whether or not to be aware of winrt::array_view in your programming. 認識しないことを選択する場合は、対応する型が C++ 標準ライブラリに現れる場合に変更すべきコードはありません。If you choose not to be aware of it then you won't have any code to change if and when an equivalent type appears in the C++ Standard Library.

コレクション パラメーターを予期している Windows ランタイム API に初期化子リストを渡すことができます。You can pass an initializer list to a Windows Runtime API that expects a collection parameter. たとえば StorageItemContentProperties::RetrievePropertiesAsync です。Take StorageItemContentProperties::RetrievePropertiesAsync for example.

IAsyncOperation<IMap<winrt::hstring, IInspectable>> StorageItemContentProperties::RetrievePropertiesAsync(IIterable<winrt::hstring> propertiesToRetrieve) const;

次のような初期化子リストを使用してその API を呼び出すことができます。You can call that API with an initializer list like this.

IAsyncAction retrieve_properties_async(StorageFile const& storageFile)
{
    auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync({ L"System.ItemUrl" }) };
}

ここでは、2 つの要因が作用しています。Two factors are at work here. 呼び出し先が最初に、構築、 std::vector初期化子リスト (この呼び出し先は非同期でできるようにする必要があります、そのオブジェクトを所有することになります)。First, the callee constructs a std::vector from the initializer list (this callee is asynchronous, so it's able to own that object, which it must). 2 番目に、C++/WinRT は、std::vector を Windows ランタイムのコレクション パラメーターとして透過的に (およびコピーを導入せずに) バインドします。Second, C++/WinRT transparently (and without introducing copies) binds std::vector as a Windows Runtime collection parameter.

標準的な配列とベクトルStandard arrays and vectors

winrt::array_view からの変換コンストラクターがありますstd::vectorstd::arrayします。winrt::array_view also has conversion constructors from std::vector and std::array.

template <typename C, size_type N> winrt::array_view(std::array<C, N>& value) noexcept
template <typename C> winrt::array_view(std::vector<C>& vectorValue) noexcept

したがって、代わりに std::vector を使用して DataWriter::WriteBytes を呼び出すことができます。So, you could instead call DataWriter::WriteBytes with a std::vector.

std::vector<byte> theVector{ 99, 98, 97 };
dataWriter.WriteBytes(theVector); // theVector is converted to a winrt::array_view before being passed to WriteBytes.

または、std::array を使用します。Or with a std::array.

std::array<byte, 3> theArray{ 99, 98, 97 };
dataWriter.WriteBytes(theArray); // theArray is converted to a winrt::array_view before being passed to WriteBytes.

C++/WinRT は、Windows ランタイムのコレクション パラメーターとして std::vector をバインドします。C++/WinRT binds std::vector as a Windows Runtime collection parameter. したがって、std::vector<winrt::hstring> を渡すと、Windows ランタイムの適切な winrt::hstring のコレクションに変換されます。So, you can pass a std::vector<winrt::hstring>, and it will be converted to the appropriate Windows Runtime collection of winrt::hstring. 呼び出し先が非同期の場合に注意する追加の詳細があります。There's an extra detail to bear in mind if the callee is asynchronous. そのケースの実装の詳細のためには、ベクターの移動やコピーを提供する必要がありますので、右辺値を提供する必要があります。Due to the implementation details of that case, you'll need to provide an rvalue, so you must provide a copy or a move of the vector. 次のコード例で、非同期呼び出し先が受け取るパラメーターの型のオブジェクトに、ベクターの所有権を移動しました (アクセスしないように注意しているvecH移動後にもう一度)。In the code example below, we move ownership of the vector to the object of the parameter type accepted by the async callee (and then we're careful not to access vecH again after moving it). 右辺値の詳細を理解する場合は、「値のカテゴリ、およびそれらへの参照します。If you want to know more about rvalues, see Value categories, and references to them.

IAsyncAction retrieve_properties_async(StorageFile const storageFile, std::vector<winrt::hstring> vecH)
{
    auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync(std::move(vecH)) };
}

ただし、Windows ランタイムのコレクションが予期されているところに std::vector<std::wstring> を渡すことはできません。But you can't pass a std::vector<std::wstring> where a Windows Runtime collection is expected. これは、Windows ランタイムの適切な std::wstring のコレクションに変換されたため、C++ 言語がそのコレクションの型パラメーターを強制的に変換しないことが原因です。This is because, having converted to the appropriate Windows Runtime collection of std::wstring, the C++ language won't then coerce that collection's type parameter(s). その結果、次のコード例はコンパイルされません (解決策は、渡すと、 std::vector<winrt::hstring> 代わりに、上記の)。Consequently, the following code example won't compile (and the solution is to pass a std::vector<winrt::hstring> instead, as shown above).

IAsyncAction retrieve_properties_async(StorageFile const& storageFile, std::vector<std::wstring> const& vecW)
{
    auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync(std::move(vecW)) }; // error! Can't convert from vector of wstring to async_iterable of hstring.
}

未処理配列、およびポインターの範囲Raw arrays, and pointer ranges

将来に相当する型が存在する注意点に注意してください方位、C++標準ライブラリは、操作することできますもと直接winrt::array_view場合を選択するかする必要があります。Bearing in mind the caveat that an equivalent type may exist in the future in the C++ Standard Library, you can also work directly with winrt::array_view if you choose to, or need to.

winrt::array_viewの範囲と、生の配列からの変換コンストラクターを持つT* (要素の型へのポインター)。winrt::array_view has conversion constructors from a raw array, and from a range of T* (pointers to the element type).

using namespace winrt;
...
byte theRawArray[]{ 99, 98, 97 };
array_view<byte const> fromRawArray{ theRawArray };
dataWriter.WriteBytes(fromRawArray); // the winrt::array_view is passed to WriteBytes.

array_view<byte const> fromRange{ theArray.data(), theArray.data() + 2 }; // just the first two elements.
dataWriter.WriteBytes(fromRange); // the winrt::array_view is passed to WriteBytes.

winrt::array_view の関数と演算子winrt::array_view functions and operators

コンストラクター、演算子、関数、および反復子のホストが実装されてwinrt::array_viewします。A host of constructors, operators, functions, and iterators are implemented for winrt::array_view. A winrt::array_view範囲ベースで使用できるように、範囲は、 for、またはstd::for_eachします。A winrt::array_view is a range, so you can use it with range-based for, or with std::for_each.

その他の例や詳細については、winrt::array_view API リファレンス トピックをご覧ください。For more examples and info, see the winrt::array_view API reference topic.

IVector<T> および標準のイテレーションの構成要素IVector<T> and standard iteration constructs

SyndicationFeed.Items 型のコレクションを返す Windows ランタイム API の例は、 IVector<T> (C + に投影します。/Cli として WinRT winrt::Windows::Foundation::Collections::IVector<T>)。SyndicationFeed.Items is an example of a Windows Runtime API that returns a collection of type IVector<T> (projected into C++/WinRT as winrt::Windows::Foundation::Collections::IVector<T>). この型は、標準のイテレーションの構成要素をなど、使用できる範囲に基づくforします。You can use this type with standard iteration constructs, such as range-based for.

// main.cpp
#include "pch.h"
#include <winrt/Windows.Web.Syndication.h>
#include <iostream>

using namespace winrt;
using namespace Windows::Web::Syndication;

void PrintFeed(SyndicationFeed const& syndicationFeed)
{
    for (SyndicationItem const& syndicationItem : syndicationFeed.Items())
    {
        std::wcout << syndicationItem.Title().Text().c_str() << std::endl;
    }
}

非同期 Windows ランタイム Api を使用した C++ のコルーチンC++ coroutines with asynchronous Windows Runtime APIs

引き続き使用できます、並列パターン ライブラリ (PPL)非同期 Windows ランタイム Api を呼び出すときにします。You can continue to use the Parallel Patterns Library (PPL) when calling asynchronous Windows Runtime APIs. ただし、多くの場合、C++ コルーチン提供、効率的でより簡単にコーディングされた表現する形式の非同期オブジェクトを操作します。However, in many cases, C++ coroutines provide an efficient and more easily-coded idiom for interacting with asynchronous objects. 詳細については、およびコード例は、次を参照してください。同時実行と非同期操作を C +/cli WinRTします。For more info, and code examples, see Concurrency and asynchronous operations with C++/WinRT.

重要な APIImportant APIs