potisanのプログラミングメモ

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

WIL GitHub Wiki 型検証ヘルパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiから記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。

型検証ヘルパー(原題:Type validation helpers)

Raymond Chen、2019/7/12、リビジョン2個

型検証ヘルパーは言語が一般に許可する不測の型変換を防止します。

このヘルパーは制限された型の集合を引数に許可することで、誤りがちな暗黙変換カテゴリの多くを抑制します。

これらのヘルパーは主にマクロで便利です。マクロは引数の型を特定できないからです。例えばこれらのヘルパーはError handling helpers(原文リンク)においてマクロ引数の型検証のため広範囲に採用されています。

使い方

型検証ヘルパーはwil/common.hで定義されています。

#include <wil/common.h>

verify_bool

template<typename T> constexpr bool verify_bool(const T& val);

bool型に変換したvalを返します。valの型は次のいずれかです。

  • bool
  • BOOL
  • BOOLEAN
  • booleanC++/CX)
  • 明示的なboolキャスト演算子を持つクラス

その他の型は以下のコンパイルエラーにより拒否されます。

Wrong Type: bool/BOOL/BOOLEAN/boolean expected

使用例

#define BEEP_IF(condition) do { if (wil::verify_bool(condition)) { Beep(); } } while ((void)0, 0)

wil::com_ptr<IUnknown> thing;
std::vector<int> vector;

BEEP_IF(thing);            // OK。com_ptrはboolキャスト演算子を持つ。
BEEP_IF(InSendMessage());  // OK。InSendMessageはBOOL型を返す。
BEEP_IF(vector.empty());   // OK。std::vector<T>::empty()はbool型を返す。
BEEP_IF(CoRevertToSelf()); // だめ。CoRevertToSelfはHRESULT型を返す。bool型ではない。

verify_BOOL

template<typename T> constexpr BOOL verify_BOOL(const T& val);

valBOOL型であればvalを返します。その他の型は以下のコンパイルエラーにより拒否されます。

Wrong Type: BOOL expected

使用例

#define BEEP_IF(condition) do { if (wil::verify_BOOL(condition)) { Beep(); } } while ((void)0, 0)

wil::com_ptr<IUnknown> thing;
std::vector<int> vector;

BEEP_IF(thing);            // だめ。com_ptrはBOOL型ではない。
BEEP_IF(InSendMessage());  // OK。InSendMessageはBOOL型を返す。
BEEP_IF(vector.empty());   // だめ。std::vector<T>::empty()はbool型を返す。
BEEP_IF(CoRevertToSelf()); // だめ。CoRevertToSelfはHRESULT型を返す。bool型ではない。

verify_hresult

template<typename T> constexpr HRESULT verify_hresult(const T& val);

valHRESULT型であればvalを返します。その他の型は以下のコンパイルエラーにより拒否されます。

Wrong Type: HRESULT expected

使用例

#define BEEP_IF_FAILED(hr) do { if (FAILED(wil::verify_hresult(hr))) { Beep(); } } while ((void)0, 0)

BEEP_IF_FAILED(InSendMessage());  // だめ。InSendMessageはBOOL型を返す。
BEEP_IF_FAILED(CoRevertToSelf()); // OK。CoRevertToSelfはHRESULT型を返す。

著作権表示

この記事は以下の著作物を使用しています。

Copyright (c) Microsoft Corporation. All rights reserved. https://github.com/microsoft/wil/blob/master/LICENSE