Вы, вероятно, могли бы сделать это проще, выполнив что-то вроде:
class error_builder
{
public:
error_builder(const std::string& pMsg = "")
{
mMsg << pMsg;
}
~error_builder(void)
{
throw std::runtime_error(mMsg.str());
}
template <typename T>
error_builder& operator<<(const T& pX)
{
mMsg << pX;
return *this;
}
private:
std::stringstream mMsg;
};
error_builder("some text") << " more text " << 42 << std::endl;
Обратите внимание, что вы не должны бросать строки, как вы, поэтому я использовал std::runtime_error
. Все исключения должны происходить от std::exception
, что runtime_error
, таким образом, все значимые исключения могут быть перехвачены с помощью const std::exception&
.
Это работает, потому что временный живет до конца полного выражения.