失われたデータを適切に無視するナローイング キャスト (一般的な解決策) を考え出そうとしています。Visual Studio では、データを失うナローイング キャストによって "Run-Time Check Failure #1" がトリガーされます。私はそれをオフにしたくありません。代わりに、narrow_cast
狭いキャストを適切に実行し、実行時チェックをトリガーしない a を実装しようとしています。
Visual Studio は次のことを提案します。
char c = (i & 0xFF);
だから私はこれから始めて、この醜い解決策を思いついた:
template< typename T >
struct narrow_mask
{
static const T value = T(0xFFFFFFFFFFFFFFFF);
};
template <typename T, typename U>
T narrow_cast(const U& a)
{
return static_cast<T>(a & narrow_mask<T>::value );
}
それは機能しますが(VSは定数のデータを失うことで完全に問題ないようです)、完全ではなく(非整数データをサポートしていません)、正しくもありません(符号付きの値では正しく機能しないと思います)。
より良い解決策、またはより良いnarrow_maskの実装に関する提案はありますか?
編集:この質問は VS 固有であるというコメントに直面して、標準ドキュメントを確認しましたが、絞り込みの結果static_cast
は実装に依存するようです。したがって、この質問は、明確に定義された (したがって、実装に依存しない) ナローイング キャストを作成するものとしてより適切に述べることができます。結果値が明確に定義されていて、タイプ ( ではない) に依存している限り、結果値の詳細についてはあまり気にしませんreturn 0
。