我尝试将子字符串(由一对迭代器表示)转换为整数boost::lexical_cast
:
#include <iostream>
#include <boost/lexical_cast.hpp>
int main()
{
// assume [first, last) as substring
const std::string s("80");
auto first = s.begin(), last = s.end();
std::cout << boost::lexical_cast<int>(boost::make_iterator_range(first, last)) << std::endl;
return 0;
}
输出:(wandbox)
1
我通过变通方法得到了预期的结果(80):boost::make_iterator_range(&*first, last - first)
。
问题:为什么以上代码无法按预期工作?而1
来自哪里?
lexical_cast
不支持iterator_range<std::string::(const_)iterator>
lexical_cast
或iterator_range
lexical_cast
或iterator_range
答案 0 :(得分:1)
简短回答是您的列表中的第2个,误用了iterator_range
- 特别是您在没有明确包含正确标题的情况下使用它。
添加:
#include <boost/range/iterator_range.hpp>
会让它按照您的预期行事。
iterator_range
及相关功能分为两个标题iterator_range_core.hpp
和iterator_range_io.hpp
。第一个包含类定义,第二个包含operator<<
重载,它使得它可以流式传输,因此lexical_cast
可以使用(在某种意义上它可以实际工作,因为你期望)。
由于您没有包含正确的标头,因此通常应该收到编译器错误,但在这种情况下,由于lexical_cast.hpp
包含这两个标头中的第一个标头iterator_range_core.hpp
,因此您无法获取它{1}}。这使得一切都很好,但它没有从第二个标题获得operator<<
。如果没有那个重载,当lexical_cast
将范围写入流以执行转换时,它找到的最佳重载是采用bool
参数的重载(因为iterator_range
具有默认转换为{ {1}})。这就是为什么您看到bool
的原因,因为它实际上将1
写入基础转化流。
您可以使用以下内容轻松测试:
true
如果没有auto someRange = boost::make_iterator_range(first, last);
std::cout << std::boolalpha<< someRange;
,则会打印#include <boost/range/iterator_range.hpp>
,true
会打印您的字符串(80)。