次のことはできません。
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;
boost::formatter
が暗黙的に変換可能である場合std::string
、「Hello .World」が生成format("%s.") % s1
されます。これは、「Hello 」に変換されるためです。その後、暗黙的に に変換され、で追加するためにstd::string
使用されますが、おそらくほとんどのプログラマーは「Hello World」を望んでいます。そして、それはエラーや混乱の原因になります。ただし、暗黙的な変換が存在しない場合、コンパイラはこれに対してエラーを生成し( for andがないため)、またはとして修正する必要がありますoperator+
s2
operator+
boost::formatter
std::string
format("%s.") % (s1 + s2)
str( 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()
呼び出しは、そのような可能性のある例外のヒントを提供します。これにより、周囲のコードの例外の安全性を確保するときの作業が楽になります。また、(この特定のケースでは) 前述のコードを再確認して、最初に例外が発生するのを防ぐようにヒントを与えることもできます。