次のようなコードがある場合
class CString { int GetLength(); };
bool smaller(CString s1, std::string s2) {
return s2.size() > s1.GetLength();
}
私にとって最善のことは何ですか?
?
s1.GetLength()
に変更 これは、「符号付きと符号なしの不一致」に関するコンパイラの警告を取り除き、キャストする意図を伝えるのに役立ち、はるかに簡単な方法です。しかし、それはおそらく眉をひそめています。:((size_t)c.GetLength()
?
s1.GetLength()
に変更 これは、「正しい」種類のキャストを使用して、警告を取り除くのに役立ちます。static_cast<size_t>(c.GetLength())
?
s1.GetLength()
に変更 非常に冗長です...この抽象化には実際的な利点がありますか、それとも破るべきですか?static_cast<std::string::size_type>(c.GetLength())
そのまま?これは、警告を犠牲にして、コンパイラがスイッチ
を使用してオーバーフローチェックを行うのに役立ちます(ここでの私の主な関心事)。/RTCc
何か他のことをしますか?
独自のキャスト関数を作成する必要がありますか? マクロを使用しますか?コンパイル時だけでなく実行時もチェックする必要がありますか? 他のアイデアはありますか?
編集:
例が少し文字通りに取られすぎているようです...
私は明らかにについて話すつもりはありCString::GetLength()
ませんでした。その特定の方法は、確かに私の大きな心配ではありません。:) 私が心配しているのは、より一般的なケースです。負になることは決してないはずですが、理論的にはバグのために負になる可能性がある整数を取得する場合です。
別のコードをオーバーライドするために、これを行うメソッドを作成している可能性があります。そのため、署名を変更することはできません。また、予想していなかったとしても、私のコードには確かにバグが含まれている可能性があります。
このような場合、どうすればよいですか?