Почему boost::format не может быть преобразован непосредственно в std:: string? [закрытый]
не возможно:
std::string s = boost::format("%d") % 1; // error
вы должны явно вызвать метод STR():
std::string s = (boost::format("%d") % 1).str(); // OK
это только синтаксический сахар, но почему бы просто не добавить преобразование?
2 ответов
это не очень хорошо, если неявное преобразование может вызывать исключения. Преобразование в string по умолчанию вызовет исключение, если в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()
вызовы предоставляют намек на такие возможные исключения, что упрощает жизнь при обеспечении безопасности исключений окружающего кода, а также (в этот конкретный случай), намекая на двойную проверку предыдущего кода, чтобы предотвратить указанное исключение в первую очередь.
Я думаю, что причина этого такая же, как std::stringstream
в этом контексте следует также использовать .str()
чтобы преобразовать поток в строку и то же самое для boost::formatter
а причина такова:
std::string s1 = "Hello ", s2 = "World";
format("%s.") % s1 + s2;