stoi - 设计问题

sma*_*llB 1 c++

我在我的一篇帖子中提出了一个关于替代方案的问题boost::lexical_cast,在许多答复中,我有一个建议stoi作为可行的替代方案。
我决定测试它,令我惊讶的是,这个函数的第二个参数(描述大小的参数)是一个指向size_t类型的指针,而不是实际size_t类型。对此是否有任何合乎逻辑的解释,以及以何种方式拥有指向实际对象的指针比对象本身更好(仅在涉及大小的这种特殊情况下,我不会本能地用指针分配大小)?

链接到 stoi 文档:http : //msdn.microsoft.com/en-us/library/ee404860.aspx

Dav*_*eas 5

这是一种具有可选参数的方式。基本上,如果您有兴趣知道哪个是未转换为数字的第一个字符。如果您对该结果并不真正感兴趣,则可以传递 nullptr。

§21.5 [string.conversions]/1 [...] 如果函数没有抛出异常并且 idx != 0,函数在 *idx 中存储 str 的第一个未转换元素的索引。

这旨在用作:

int main() {
   std::string two{"2 and more contents"};
   // I don't care, just want a number:
   int i = std::stoi( two, 0, 10 );            // base = 0

   std::size_t first_not_converted;
   int i = std::stoi( two, &first_not_converted, 10 );

   std::cout << "Unconverted string is: " << two.substr( first_not_converted ) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

通过使用指针,您可以使参数真正可选,如果它是一个输出参数,但需要使用引用,但这将要求用户代码始终创建变量,无论他们是否对该值感兴趣,所以它不会是真正的可选。

  • @smallB:对于输入`"10B"`,`stoi` 将返回`10` 并将指针设置为`2` 以指示您现在可以从`"B"` 开始读取以获取字符串的其余部分. (4认同)