std:: лексический состав-есть ли такая вещь?
определяет ли стандартная библиотека C++ эту функцию, или мне нужно прибегнуть к Boost?
Я искал в интернете и не мог найти ничего, кроме Boost, но я подумал, что лучше спросить Здесь.
5 ответов:
только частично.
C++11
<string>
иstd::to_string
для встроенных типов:
[n3290: 21.5/7]:
string to_string(int val); string to_string(unsigned val); string to_string(long val); string to_string(unsigned long val); string to_string(long long val); string to_string(unsigned long long val); string to_string(float val); string to_string(double val); string to_string(long double val);
возвращает: каждая функция возвращает
string
объект, содержащий символьное представление значения его аргумента, которое бы генерируется путем вызоваsprintf(buf, fmt, val)
в формате спецификатор"%d"
,"%u"
,"%ld"
,"%lu"
,"%lld"
,"%llu"
,"%f"
,"%f"
или"%Lf"
, соответственно, гдеbuf
обозначает внутренний символьный буфер достаточного размера.есть также следующие, которые идут в обратном направлении:
[n3290: 21.5/1, 21.5/4]:
int stoi(const string& str, size_t *idx = 0, int base = 10); long stol(const string& str, size_t *idx = 0, int base = 10); unsigned long stoul(const string& str, size_t *idx = 0, int base = 10); long long stoll(const string& str, size_t *idx = 0, int base = 10); unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10); float stof(const string& str, size_t *idx = 0); double stod(const string& str, size_t *idx = 0); long double stold(const string& str, size_t *idx = 0);
однако, нет ничего общего, что вы можете использовать (по крайней мере не раньше TR2 может быть!), и вообще ничего в C++03.
нет это не так, даже в C++11, но это предложенных для включения в техническом отчете 2, следующий набор расширений библиотеки std.
там нет std:: lexical_cast, но вы всегда можете сделать что-то подобное с stringstreams:
template <typename T> T lexical_cast(const std::string& str) { T var; std::istringstream iss; iss.str(str); iss >> var; // deal with any error bits that may have been set on the stream return var; }
если вы не хотите повысить, то легкая библиотека называется fmt реализует следующее:
// Works with all the C++11 features and AFAIK faster then boost or standard c++11 std::string string_num = fmt::FormatInt(123456789).str(); // or .c_str()
больше примеров из официальная страница.
доступ к аргументам по позиции:
format("{0}, {1}, {2}", 'a', 'b', 'c'); // Result: "a, b, c" format("{}, {}, {}", 'a', 'b', 'c'); // Result: "a, b, c" format("{2}, {1}, {0}", 'a', 'b', 'c'); // Result: "c, b, a" format("{0}{1}{0}", "abra", "cad"); // arguments' indices can be repeated // Result: "abracadabra"
выравнивание текста и указание ширины:
format("{:<30}", "left aligned"); // Result: "left aligned " format("{:>30}", "right aligned"); // Result: " right aligned" format("{:^30}", "centered"); // Result: " centered " format("{:*^30}", "centered"); // use '*' as a fill char // Result: "***********centered***********"
замена %+f, % - f и % f и указание знака:
format("{:+f}; {:+f}", 3.14, -3.14); // show it always // Result: "+3.140000; -3.140000" format("{: f}; {: f}", 3.14, -3.14); // show a space for positive numbers // Result: " 3.140000; -3.140000" format("{:-f}; {:-f}", 3.14, -3.14); // show only the minus -- same as '{:f}; {:f}' // Result: "3.140000; -3.140000"
замена %x и %o и преобразование значения в другое основания:
format("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42); // Result: "int: 42; hex: 2a; oct: 52; bin: 101010" // with 0x or 0 or 0b as prefix: format("int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}", 42); // Result: "int: 42; hex: 0x2a; oct: 052; bin: 0b101010"