Nie jest to bardzo dobra rzecz, jeśli niejawna konwersja może powodować wyjątki. Konwersja na łańcuch domyślnie spowoduje zgłoszenie wyjątku, jeśli mniej argumentów zostanie przesłanych do format
niż jest to konieczne. E.g.
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
}
Takie niejawne konwersje utrudniają wykrywanie i analizowanie części kodu, które mogą generować wyjątki. Ale wyraźne wywołania .str()
dają wskazówkę dotyczącą takich możliwych wyjątków, co ułatwia życie, zapewniając wyjątkowe bezpieczeństwo kodu otaczającego, a także (w tym konkretnym przypadku) podpowiedź do podwójnego sprawdzenia poprzedniego kodu, aby zapobiec powstaniu wyjątku. .
Czy przeciążenie% nie wystarczy? :) – jrok
Nie jestem pewien, jakiego rodzaju odpowiedzi szukasz tutaj. Pytasz, czy istnieją jakieś problemy semantyczne, które uniemożliwiają Boostowi realizację czegoś takiego? A może po prostu mówisz: "Powinni byli to zrobić w ten sposób". –
Próbuję zrozumieć zagadnienia semantyczne. Zwykle uważam, że biblioteki boost są dobrze zaprojektowane. –