MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiからsafe_cast
の記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。
一部のリンク切れは意図的なものです。原文をご参照ください。
safe_cast
Raymond Chen、2019/5/8、リビジョン2個
WILのsafe_cast
テンプレートライブラリは潜在的に危険な整数キャストを実行する標準化された方法を提供します。このキャストは縮小変換(narrowing casts)、符号変換(sign change casts)、あるいは対象アーキテクチャによりサイズの異なるsize_t
のような型のキャストに使います。
キャストが安全か潜在的に危険かはSFINAEを用いてコンパイル中に判断されます。
キャストが潜在的に危険な場合、
safe_cast
はintsafe.hで定義された適切な整数キャストでラップして、HRESULT
をチェックして、キャストの失敗をハンドルします。キャストが安全と知られている場合、
safe_cast
はstatic_cast
を実行するだけです。
safe_cast
には3種類の版があり、それぞれintsafe.hの失敗のハンドルが異なります。プロジェクトのエラーハンドリングモデルに依存して使い分けてください。
実装の詳細は safecast.h
(Wil - GitHub)を参照してください。
使い方
safe_cast
関数はWILの1ヘッダーに定義されています。プロジェクトで使用するには次のインクルードをソースファイルまたはプリコンパイルヘッダーに追加してください。
#include <wil\safecast.h>
すべての関数はwil::
名前空間に定義されています。
関数
潜在的に危険な変換 | ノート |
---|---|
t = safe_cast<T>(val); |
変換失敗時は例外を発生します。#define WIL_ENABLE_EXCEPTIONS を定義してください。 |
t = safe_cast_failfast<T>(val); |
変換失敗時はフェイルファストします。 |
hr = safe_cast_nothrow<T>(val, &t); |
成功か失敗かを表すHRESULT を返します。 |
常に安全な変換 | ノート |
---|---|
t = safe_cast<T>(val); |
#define WIL_ENABLE_EXCEPTIONS を定義してください。 |
t = safe_cast_failfast<T>(val); |
|
t = safe_cast_nothrow<T>(val); |
safe_cast_nothrow<T>
を使う場合、その変換が潜在的に危険か常に安全かに基づいて適切なオーバーロードを選択してください。選択を誤るとエラーとなる可能性があります。
すべての場合において、報告されるエラーはintsafe変換関数のHRESULT
です。
ネイティブwchar_t
safe_cast
はネイティブwchar_t
の変換もサポートしますが、これは現在intsafeにサポートされていません。MSDNによるとWindowsではwchar_t
はネイティブ型であり、unsigned short
(0~65,535)と同じ値域を持ちます。したがって、intsafeではunsigned short
として扱えます。wchar_t
からのsafe_cast
では、unsigned short
にstatic_cast
してからintsafeを呼び出します。wchar_t
へのsafe_cast
では、intsafeの戻り値はsafe_cast
が結果を返す前にwchar_t
へstatic_cast
されます。
著作権表示
この記事は以下の著作物を使用しています。
Copyright (c) Microsoft Corporation. All rights reserved. https://github.com/microsoft/wil/blob/master/LICENSE