potisanのプログラミングメモ

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

WIL GitHub Wiki safe_castの和訳・改変

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_caststatic_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 shortstatic_castしてからintsafeを呼び出します。wchar_tへのsafe_castでは、intsafeの戻り値はsafe_castが結果を返す前にwchar_tstatic_castされます。

著作権表示

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

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