#include <iostream>
#include <sstream>
template <class exception, class charT, class traits>
std::basic_ostream<charT,traits>& throw_cpp(std::basic_ostream<charT,traits>& os)
{
std::stringstream& self = dynamic_cast<std::stringstream&>(os); //maybe throws std::bad_cast
throw exception(self.str());
return os; //redundant, but the compiler might not know that.
}
#include <stdexcept>
#include <fstream>
int main() {
try {
int world = 42;
std::stringstream() << "HELLO " << world << throw_cpp<std::logic_error>;
} catch(const std::logic_error& e) {
std::cerr << e.what() << '\n';
}
try {
std::fstream() << "HELLO " << throw_cpp<std::logic_error>;
} catch(const std::exception& e) {
std::cerr << e.what() << '\n';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KCnRlbXBsYXRlIDxjbGFzcyBleGNlcHRpb24sIGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CnN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyVCx0cmFpdHM+JiB0aHJvd19jcHAoc3RkOjpiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4mIG9zKQp7CiAgICBzdGQ6OnN0cmluZ3N0cmVhbSYgc2VsZiA9IGR5bmFtaWNfY2FzdDxzdGQ6OnN0cmluZ3N0cmVhbSY+KG9zKTsgLy9tYXliZSB0aHJvd3Mgc3RkOjpiYWRfY2FzdAogICAgdGhyb3cgZXhjZXB0aW9uKHNlbGYuc3RyKCkpOwogICAgcmV0dXJuIG9zOyAvL3JlZHVuZGFudCwgYnV0IHRoZSBjb21waWxlciBtaWdodCBub3Qga25vdyB0aGF0Lgp9CgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8ZnN0cmVhbT4KaW50IG1haW4oKSB7CiAgICB0cnkgewogICAgICAgIGludCB3b3JsZCA9IDQyOwogICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtKCkgPDwgIkhFTExPICIgPDwgd29ybGQgPDwgdGhyb3dfY3BwPHN0ZDo6bG9naWNfZXJyb3I+OwogICAgfSBjYXRjaChjb25zdCBzdGQ6OmxvZ2ljX2Vycm9yJiBlKSB7CiAgICAgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8ICdcbic7IAogICAgfQogICAgdHJ5IHsKICAgICAgICBzdGQ6OmZzdHJlYW0oKSA8PCAiSEVMTE8gIiA8PCB0aHJvd19jcHA8c3RkOjpsb2dpY19lcnJvcj47CiAgICB9IGNhdGNoKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgICAgc3RkOjpjZXJyIDw8IGUud2hhdCgpIDw8ICdcbic7IAogICAgfQp9