この世界のすべての数値が正の整数であり、uintX_t C++ 型で表現できると仮定しましょう。
std::string を数値に変換する次のすばらしいコードを考えてみましょう。
#include <string>
#include <cstdint>
#include <iostream>
template <typename T>
T MyAwsomeConversionFunction(const std::string& value)
{
T result = 0;
for(auto it = value.begin(); it != value.end() && std::isdigit(*it); ++it)
{
result = result * 10 + *it - '0';
}
return result;
}
int main(int argc, const char * argv[])
{
std::cout<<MyAwsomeConversionFunction<uint16_t>("1234")<<std::endl;
std::cout<<MyAwsomeConversionFunction<uint16_t>("123456")<<std::endl;
return 0;
}
ご覧のとおり、この関数には複数のエラーがありますが、特定のエラーに興味があります: 型が値を格納するのに十分な大きさでない場合 (例として 2 番目の変換呼び出し) を検出し、作成時に UB を回避する方法result = result * 10 + *it - '0';
。T
その操作を行う前に最大値を超えるかどうかを知りたいです。これは可能ですか?
編集: Is signed integer overflow still undefined behavior in C++?を確認してください。C++ の算術演算に関する UB の詳細については、result = result * 10 + *it - '0';
結果がオーバーフローするときに行を実行することを避けたい。答えでは、行はまだ実行されています...
EDIT2:ここで答えを見つけました:整数オーバーフローを検出する方法?
EDIT3: 受け入れられた回答は、署名された型に適用されます。unsigned 型の場合 Cheers と hth. - アルフの答えは正しいです。