以下是不可能的:
std::string s = boost::format("%d") % 1; // error
您必须显式调用 str() 方法:
std::string s = (boost::format("%d") % 1).str(); // OK
它只是语法糖,但为什么不添加转换呢?
以下是不可能的:
std::string s = boost::format("%d") % 1; // error
您必须显式调用 str() 方法:
std::string s = (boost::format("%d") % 1).str(); // OK
它只是语法糖,但为什么不添加转换呢?
我认为这样做的原因与 相同std::stringstream
,在这种情况下,您还应该使用.str()
将流转换为字符串和相同boost::formatter
的原因,原因如下:
std::string s1 = "Hello ", s2 = "World";
format("%s.") % s1 + s2;
现在 ifboost::formatter
可以隐式转换为std::string
then 它产生“Hello .World”,因为format("%s.") % s1
将被转换为“Hello ”。然后它将被隐式转换为std::string
并用于operator+
添加它s2
,但可能大多数程序员都希望拥有“Hello World”。这将是错误和混乱的根源。但是在不存在隐式转换的情况下,编译器会为此生成错误(因为没有operator+
for boost::formatter
and std::string
)并且您可以将其更正为format("%s.") % (s1 + s2)
orstr( format("%s.") % s1 ) + s2
如果隐式转换可以抛出异常,这不是一件好事。如果输入的参数少于所需的参数,则默认情况下转换为字符串会引发异常format
。例如
std::string f()
{
boost::format fmt("%d");
// forgot to feed an argument
std::string s = fmt; // throws boost::io::too_few_args
widget.set_title( fmt ); // throws boost::io::too_few_args
return fmt; // throws boost::io::too_few_args
}
这种隐式转换使得很难发现和分析可能引发异常的代码部分。但是显式.str()
调用提供了此类可能异常的提示,这在确保周围代码的异常安全时使生活更轻松,并且(在这种特殊情况下)提示仔细检查前面的代码以首先防止所述异常发生。