C++ 我应该在什么时候使用Boost';你的演员是谁?这是最后手段吗?

C++ 我应该在什么时候使用Boost';你的演员是谁?这是最后手段吗?,c++,boost,idioms,lexical-cast,C++,Boost,Idioms,Lexical Cast,Boost的词法转换将数字(或任意对象)转换为字符串并返回。比如说,我应该更多地使用它,而不是将内容流式传输到std::stringstreams吗?还是更像是一种最后手段 以下是两种备选方法的一个示例: std::stringstream message; message << "foo " << bar << ' ' << baz; doSomething(message.str()); std::stringstream

Boost的
词法转换
将数字(或任意对象)转换为字符串并返回。比如说,我应该更多地使用它,而不是将内容流式传输到
std::stringstream
s吗?还是更像是一种最后手段

以下是两种备选方法的一个示例:

std::stringstream message;
message << "foo " << bar << ' ' << baz;
doSomething(message.str());
std::stringstream消息;

message我想说,在将字符串转换为数字时,您应该始终使用词法转换,因为如果没有它,您将不知道它是否真的是数字(错误的词法转换例外)。字符串流不会抛出任何内容,并使数字保持未初始化状态。

词法转换不会“大部分”转换数字。这是一个任何文本流的机制。是的,视情况而定。我可以自由地使用词法转换,但我会毫不犹豫地根据用例使用std::stoi、std::to_string、Boost{Spirit | Format | Serializaton}

简言之:这不是一种万不得已的机制。这也不是最终的解决方案


背景

  • 一个普遍的反对意见是,词法转换会很慢。这种情况很少发生(现在),因为它专门用于常见的基元类型
  • 词法转换的接口仅适用于解析永远不会/很少失败的情况;否则,您更喜欢报告输入验证错误而无异常的界面

人力资源管理?您可以(也应该)处理流错误。这是一个很弱的论点。@einpoklum,正如sehe提到的,我的论点不太强。在您的情况下,我更喜欢stringstream版本。我想说,
boost::lexical_cast
只能通过异常报告错误这一事实是一个非常有力的反对理由。如果您正在处理用户输入,您不希望出现异常;您需要一个可以在本地测试和处理的错误。@JamesKanze您也可以在本地“稍微”处理异常,此外,您应该始终处理异常处理异常只能在更高级别上进行。在本地快速处理它们会导致无法读取的代码;异常的全部意义在于不必在本地处理它们。例如,第三个选项:
doSomething(boost::format(“foo%1%%2%”)和%bar%baz)
@aschepler,太多的
%
使得它非常不可读。
doSomething("foo " + lexical_cast<string>(bar) + " " + lexical_cast<string>(baz));