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
の型は次のいずれかです。
その他の型は以下のコンパイルエラーにより拒否されます。
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);
val
がBOOL
型であれば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);
val
がHRESULT
型であれば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