stoi - 设计问题

时间:2011-06-20 07:01:17

标签: c++

我在my posts中提到了一个关于boost::lexical_cast替代方案的问题,在许多回复中,我有一个建议stoi作为可行的替代方案。
我决定对它进行测试,令我惊讶的是,这个函数的第二个参数(描述大小的参数)是指向size_t类型的指针,而不是实际的size_t类型。有没有任何合理的解释,以什么方式最好有一个指向实际对象的指针而不是对象本身(只是在这种特殊情况下,当涉及大小而我不会本能地用指针分配大小)?

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

2 个答案:

答案 0 :(得分:4)

这是一种拥有可选参数的方法。基本上,如果您有兴趣知道哪个是未转换为数字的第一个字符。如果您对该结果不是很感兴趣,可以传递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;
}

通过使用指针,您可以使参数真正可选,如果它是out参数,但需要使用引用,但这需要用户代码创建变量始终而不管他们是否对价值感兴趣,所以它不是真正的选择。

答案 1 :(得分:2)

我认为size_t *参数是一个指向变量的指针,stoi在转换后的数字结束后将字符串放置在字符串中。即它是一个'out'参数,因此是一个指针。

例如:http://msdn.microsoft.com/en-us/library/ee404860.aspx

也许您应该指出令人困惑的特定文档。