std :: lexical_cast – 有这样的事情吗?

C ++标准库是否定义了这个函数,还是必须求助于Boost?

我search了网页,除了Boost之外找不到任何东西,但我想我最好在这里问一下。

只有部分。

对于内置types,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)生成的参数值的字符表示forms,格式说明符为"%d""%u""%ld""%lu" "%llu" "%lld""%llu" "%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); 

然而,没有什么通用的,你可以使用(至less不是直到TR2 ,也许!),并没有什么在C + + 03。

不,即使在C ++ 11中也不是,但是build议将其包含在技​​术报告2中,这是下一组标准库扩展。

没有std :: lexical_cast,但是你总是可以用stringstream来做类似的事情:

 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" 

alignment文本并指定宽度:

 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***********" 

replace%+ 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" 

replace%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"