C++1zから、低レイヤーの文字列・数値間の変換関数が導入されます。これは、ハイパフォーマンスな文字列処理をするための基礎を提供することを目的としています。
数値から文字列への変換はto_chars()
、文字列から数値への変換はfrom_chars()
という関数です。これらの関数は、以下の特徴があります。
- ロケールはCロケール (POSIXロケール) 固定
- 関数内での動的メモリ確保なし
- フォーマットはパラメータとして与え、自動的にフォーマットを解析することはない
- 使用できるフォーマットも最小限
+
符号の指定はできない- 文字列中のスペースは許容されない
#
による小数点以下の桁数指定はできない- ゼロ埋めはできない
- 小文字のみ許容し、大文字は扱えない
- 16進数に
0x
は付けられない
- 例外送出なし
#include <iostream> #include <utility> #include <limits> int main() { { char str[std::numeric_limits<int>::digits10 + 2] = {0}; // '-' + NULL int input = 123456; // 整数inputを10進数で文字列に変換し、strに出力 std::to_chars(std::begin(str), std::end(str), input, 10); std::cout << str << std::endl; // 123456 } { const char input[] = "-123456"; int value = 0; // 10進数の整数が入った文字列を、intに変換 std::from_chars(std::begin(input), std::end(input), value); std::cout << value << std::endl; // -123456 } }
宣言
// <utility> namespace std { struct to_chars_result { char* ptr; error_code ec; }; enum class chars_format { scientific = unspecified, fixed = unspecified, hex = unspecified, general = fixed | scientific }; // 数値から文字列への変換 to_chars_result to_chars(char* first, char* last, see below value, int base = 10); // 整数版 to_chars_result to_chars(char* first, char* last, float value); to_chars_result to_chars(char* first, char* last, double value); to_chars_result to_chars(char* first, char* last, long double value); to_chars_result to_chars(char* first, char* last, float value, chars_format fmt); to_chars_result to_chars(char* first, char* last, double value, chars_format fmt); to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt); to_chars_result to_chars(char* first, char* last, float value, chars_format fmt, int precision); to_chars_result to_chars(char* first, char* last, double value, chars_format fmt, int precision); to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt, int precision); // 文字列から数値への変換 struct from_chars_result { const char* ptr; error_code ec; }; from_chars_result from_chars(const char* first, const char* last, see below& value, int base = 10); // 整数版 from_chars_result from_chars(const char* first, const char* last, float& value, chars_format fmt = chars_format::general); from_chars_result from_chars(const char* first, const char* last, double& value, chars_format fmt = chars_format::general); from_chars_result from_chars(const char* first, const char* last, long double& value, chars_format fmt = chars_format::general); }
参照
- P0067R0 Elementary string conversions
- P0067R1 Elementary string conversions, revision 1
- P0067R2 Elementary string conversions, revision 2
- P0067R3 Elementary string conversions, revision 3
- P0067R4 Elementary string conversions, revision 4
- P0067R5 Elementary string conversions, revision 5
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。