#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)
{
try {
std::istringstream iss(s);
iss.exceptions(std::ios::failbit | std::ios::badbit);
T ret;
iss >> std::noskipws >> ret;
return ret;
}
catch( std::exception & err )
{
throw( bad_from_string("fuck you") );
}
}
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+ClQgZnJvbV9zdHJpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHMpCnsKCXRyeSB7CgkJc3RkOjppc3RyaW5nc3RyZWFtIGlzcyhzKTsKCQlpc3MuZXhjZXB0aW9ucyhzdGQ6Omlvczo6ZmFpbGJpdCB8IHN0ZDo6aW9zOjpiYWRiaXQpOwoJCVQgcmV0OwoJCWlzcyA+PiBzdGQ6Om5vc2tpcHdzID4+IHJldDsKCQlyZXR1cm4gcmV0OwoJfQoJY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uICYgZXJyICkKCXsKCQl0aHJvdyggYmFkX2Zyb21fc3RyaW5nKCJmdWNrIHlvdSIpICApOwkKCX0KfQoKaW50IG1haW4oKQp7CgkjZGVmaW5lIF9DQVRDSCgpIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiBjb25zdCYgZSkgeyBzdGQ6OmNvdXQ8PCJjYXRjaCBzdGQ6OmV4Y2VwdGlvbjogIjw8IGUud2hhdCgpOyB9IGNhdGNoICguLi4pIHsgc3RkOjpjb3V0PDwiY2F0Y2ggdW5rbm93biI7IH0KCglzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc3sgIjEyMyIsICIxMi4zIiwgIiIsICIgIiwgImFiYyIsICIgMTIzIiwgIjEyMyAiLCAiMTIgMyIsICItMSIsICJhIiwgIkEiIH07Cglmb3IgKGF1dG8mIHN0ciA6IHN0cmluZ3MpCgl7CgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbCA8PCAiZnJvbV9zdHJpbmcoXCciIDw8IHN0ciA8PCAiXCcpOiI7CgkJdHJ5IHsgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbCA8PCAiPHN0cmluZz46ICI7IHN0ZDo6Y291dCA8PCBmcm9tX3N0cmluZzxzdGQ6OnN0cmluZz4oc3RyKTsgfSBfQ0FUQ0goKQoJCXRyeSB7IHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGwgPDwgIjxkb3VibGU+OiAiOyBzdGQ6OmNvdXQgPDwgZnJvbV9zdHJpbmc8ZG91YmxlPihzdHIpOyB9IF9DQVRDSCgpCgkJdHJ5IHsgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbCA8PCAiPGludD4gICA6ICI7IHN0ZDo6Y291dCA8PCBmcm9tX3N0cmluZzxpbnQ+KHN0cik7IH0gX0NBVENIKCkKCQl0cnkgeyBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIDw8ICI8Y2hhcj4gIDogIjsgc3RkOjpjb3V0IDw8IGZyb21fc3RyaW5nPGNoYXI+KHN0cik7IH0gX0NBVENIKCkKCQlzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJfQoKCXJldHVybiAwOwp9