potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

WIL GitHub Wiki 引数処理ヘルパーの和訳・改変

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_paramassign_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の場合)、何もしません。

ノートoutParamnullptrassign_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