MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiから記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。
引数処理ヘルパー(原題:Parameter handling helpers)
Raymond Chen、2019/7/23、リビジョン1個
引数処理ヘルパーはABI関数の出力引数管理を補助します。
使い方
引数処理ヘルパーはwil/common.h
に定義されています。
#include <wil/common.h>
assign_to_opt_param
とassign_null_to_opt_param
template<typename T> void assign_to_opt_param(T* outParam, T value); template<typename T> void assign_null_to_opt_param(T* outParam);
いくつかの関数はポインター引数を介して追加情報を返します。呼び出し側は追加情報が不要であることを示すためにnullptr
を渡せます。その意味でこれらの引数は「省略可能(optional)」と考えられます。
assign_to_opt_param
関数は省略可能引数の値に特定の値を設定します。
assign_null_to_opt_param
関数は省略可能引数の値にnullptr
を設定します。
省略可能引数がない場合(nullptr
の場合)、何もしません。
ノート:outParam
がnullptr
でassign_to_opt_param
を呼び出す場合、value
は破棄されます。value
に特別なリソース管理が必要な場合、assign_to_opt_param
は使わないでください。
使用例
HRESULT CreateWidget( _Out_ Widget** widget, _Out_opt_ PCWSTR* name = nullptr, _Out_opt_ bool* isRemote = nullptr) { // エラー時出力引数の事前初期化(Preinitialize) wil::assign_null_to_opt_param(name); wil::assign_to_opt_param(isRemote, false); *widget = nullptr; wil::unique_cotaskmem_string widgetName; RETURN_IF_FAILED(GenerateUniqueName(&widgetName)); auto createdWidget = wil::unique_widget(new(std::nothrow) Widget(widgetName.get())); RETURN_IF_NULL_ALLOC(createdWidget); // 間違え!nameがnullptrの場合に文字列がリークする。 wil::assign_to_opt_param(name, widgetName.release()); // 正しい:消費者の存在時のみスマートポインタから転送する。 if (name) { *name = widgetName.release(); } wil::assign_to_opt_param(is_remote, widget->is_remote); *widgetResult = widget.release(); return S_OK; }
著作権表示
この記事は以下の著作物を使用しています。
Copyright (c) Microsoft Corporation. All rights reserved. https://github.com/microsoft/wil/blob/master/LICENSE