#include <sstream>
#include <exception>
#include <vector>
#include <string>
#include <iostream>
class bad_from_string : public std::exception
{
public:
bad_from_string(std::string const& s)
: msg(s) {}
const char * what() const noexcept
{
return msg.c_str();
}
private:
std::string msg;
};
template<class T>
T from_string(std::string const& s)
{
std::istringstream iss(s);
iss.exceptions(std::ios::failbit | std::ios::badbit);
T ret;
iss >> std::noskipws >> ret;
return ret;
}
int main()
{
#define _CATCH() catch (std::exception const& e) { std::cout<<"catch std::exception: "<< e.what(); } catch (...) { std::cout<<"catch unknown"; }
std::vector<std::string> strings{ "123", "12.3", "", " ", "abc", " 123", "123 ", "12 3", "-1", "a", "A" };
for (auto& str : strings)
{
std::cout << std::endl << "from_string(\'" << str << "\'):";
try { std::cout << std::endl << "<string>: "; std::cout << from_string<std::string>(str); } _CATCH()
try { std::cout << std::endl << "<double>: "; std::cout << from_string<double>(str); } _CATCH()
try { std::cout << std::endl << "<int> : "; std::cout << from_string<int>(str); } _CATCH()
try { std::cout << std::endl << "<char> : "; std::cout << from_string<char>(str); } _CATCH()
std::cout << std::endl;
}
return 0;
}
I2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxleGNlcHRpb24+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCgpjbGFzcyBiYWRfZnJvbV9zdHJpbmcgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KewpwdWJsaWM6CgliYWRfZnJvbV9zdHJpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHMpCgkJOiBtc2cocykge30KCWNvbnN0IGNoYXIgKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQKCXsKCQlyZXR1cm4gbXNnLmNfc3RyKCk7Cgl9Cgpwcml2YXRlOgoJc3RkOjpzdHJpbmcgbXNnOwp9OwoKCnRlbXBsYXRlPGNsYXNzIFQ+ClQgZnJvbV9zdHJpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHMpCnsKCXN0ZDo6aXN0cmluZ3N0cmVhbSBpc3Mocyk7Cglpc3MuZXhjZXB0aW9ucyhzdGQ6Omlvczo6ZmFpbGJpdCB8IHN0ZDo6aW9zOjpiYWRiaXQpOwoKCVQgcmV0OwoJaXNzID4+IHN0ZDo6bm9za2lwd3MgPj4gcmV0OwoKCXJldHVybiByZXQ7Cn0KCmludCBtYWluKCkKewoJI2RlZmluZSBfQ0FUQ0goKSBjYXRjaCAoc3RkOjpleGNlcHRpb24gY29uc3QmIGUpIHsgc3RkOjpjb3V0PDwiY2F0Y2ggc3RkOjpleGNlcHRpb246ICI8PCBlLndoYXQoKTsgfSBjYXRjaCAoLi4uKSB7IHN0ZDo6Y291dDw8ImNhdGNoIHVua25vd24iOyB9CgoJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3N7ICIxMjMiLCAiMTIuMyIsICIiLCAiICIsICJhYmMiLCAiIDEyMyIsICIxMjMgIiwgIjEyIDMiLCAiLTEiLCAiYSIsICJBIiB9OwoJZm9yIChhdXRvJiBzdHIgOiBzdHJpbmdzKQoJewoJCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGwgPDwgImZyb21fc3RyaW5nKFwnIiA8PCBzdHIgPDwgIlwnKToiOwoJCXRyeSB7IHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGwgPDwgIjxzdHJpbmc+OiAiOyBzdGQ6OmNvdXQgPDwgZnJvbV9zdHJpbmc8c3RkOjpzdHJpbmc+KHN0cik7IH0gX0NBVENIKCkKCQl0cnkgeyBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIDw8ICI8ZG91YmxlPjogIjsgc3RkOjpjb3V0IDw8IGZyb21fc3RyaW5nPGRvdWJsZT4oc3RyKTsgfSBfQ0FUQ0goKQoJCXRyeSB7IHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGwgPDwgIjxpbnQ+ICAgOiAiOyBzdGQ6OmNvdXQgPDwgZnJvbV9zdHJpbmc8aW50PihzdHIpOyB9IF9DQVRDSCgpCgkJdHJ5IHsgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbCA8PCAiPGNoYXI+ICA6ICI7IHN0ZDo6Y291dCA8PCBmcm9tX3N0cmluZzxjaGFyPihzdHIpOyB9IF9DQVRDSCgpCgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCX0KCglyZXR1cm4gMDsKfQ==