注
winrt::box_value 関数と winrt::unbox_value 関数を使用して、スカラー値だけでなく、ほとんどの種類の配列 (列挙型の配列を除く) のボックス化とボックス化解除 を 行うことができます。 winrt::unbox_value_or 関数を使用して、スカラー値のみをボックス化解除できます。
IInspectable インターフェイスは、Windows ランタイム (WinRT) のすべてのランタイム クラスのルート インターフェイスです。 これは、すべての COM インターフェイスとクラスのルートに IUnknown があり、すべての共通型システムクラスのルートに System.Object があるのと似た考えです。
つまり、 IInspectable を必要とする関数は、任意のランタイム クラスのインスタンスを渡すことができます。 ただし、このような関数にスカラー値 (数値やテキスト値など) や配列を直接渡すことはできません。 代わりに、スカラー値または配列値を参照クラス オブジェクト内にラップする必要があります。 そのラッピング処理は、ボックス化 の値として知られています。
Von Bedeutung
Windows ランタイム API に渡すことができる任意の型をボックス化およびボックス化解除できます。 つまり、Windows ランタイム型です。 数値とテキストの値 (文字列)、および配列は、上記の例です。 もう 1 つの例は、IDL で定義する struct
です。 通常の C++ struct
(IDL で定義されていないもの) をボックス化しようとすると、コンパイラは Windows ランタイム型のみをボックス化できることを通知します。 ランタイム クラスは Windows ランタイム型ですが、もちろん、ランタイム クラスをボックス化せずに Windows ランタイム API に渡すことができます。
C++/WinRT は、スカラー値または配列値を受け取り、それを IInspectableにボックス化して返す winrt::box_value 関数を提供します。
IInspectable をスカラー値または配列値にアンボックスするには、winrt::unbox_value 関数を使用します。
値のボックス化の例
LaunchActivatedEventArgs::Arguments アクセサー関数は、スカラー値である winrt::hstring を返します。 hstring の値をボックス化して、このように IInspectable を期待する関数に渡すことができます。
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
...
rootFrame.Navigate(winrt::xaml_typename<BlankApp1::MainPage>(), winrt::box_value(e.Arguments()));
...
}
XAML ボタンのコンテンツ プロパティを設定するには、 Button::Content ミューテーター関数を呼び出します。 content プロパティを文字列値に設定するには、このコードを使用します。
Button().Content(winrt::box_value(L"Clicked"));
最初に、 hstring 変換コンストラクターは、文字列リテラルを hstring に変換します。 その後、winrt::box_value オーバーロードが、hstring を取る形で呼び出されます。
IInspectable のボックス化解除の例
独自に作成した関数で IInspectable
void Unbox(winrt::Windows::Foundation::IInspectable const& object)
{
hstring hstringValue = unbox_value<hstring>(object); // Throws if object is not a boxed string.
hstringValue = unbox_value_or<hstring>(object, L"Default"); // Returns L"Default" if object is not a boxed string.
float floatValue = unbox_value_or<float>(object, 0.f); // Returns 0.0 if object is not a boxed float.
std::optional<int> optionalInt = object.try_as<int>(); // Returns std::nullopt if object is not a boxed int.
}
ボックス化された値の型を決定する
ボックス化された値を受け取り、その中にどの型が含まれているかわからない場合は (ボックス化を解除するにはその型を知る必要があります)、ボックス化された値に対して IPropertyValue インターフェイスをクエリして、その上で Type を呼び出すことができます。 コード例を次に示します。
WINRT_ASSERT
はマクロ定義であり、_ASSERTEに展開されます。
float pi = 3.14f;
auto piInspectable = winrt::box_value(pi);
auto piPropertyValue = piInspectable.as<winrt::Windows::Foundation::IPropertyValue>();
WINRT_ASSERT(piPropertyValue.Type() == winrt::Windows::Foundation::PropertyType::Single);
重要な API
- IInspectable インターフェイス
- winrt::box_value 関数テンプレート
- winrt::hstring 構造体
- winrt::unbox_value 関数テンプレート
- winrt::unbox_value_or 関数テンプレートの を
と定義する