fork(1) download
  1. #include <sstream>
  2. #include <exception>
  3. #include <vector>
  4. #include <string>
  5. #include <iostream>
  6.  
  7.  
  8. class bad_from_string : public std::exception
  9. {
  10. public:
  11. bad_from_string(std::string const& s)
  12. : msg(s) {}
  13. const char * what() const noexcept
  14. {
  15. return msg.c_str();
  16. }
  17.  
  18. private:
  19. std::string msg;
  20. };
  21.  
  22.  
  23. template<class T>
  24. T from_string(std::string const& s)
  25. {
  26. std::istringstream iss(s);
  27. iss.exceptions(std::ios::failbit | std::ios::badbit);
  28.  
  29. T ret;
  30. iss >> std::noskipws >> ret;
  31.  
  32. return ret;
  33. }
  34.  
  35. int main()
  36. {
  37. #define _CATCH() catch (std::exception const& e) { std::cout<<"catch std::exception: "<< e.what(); } catch (...) { std::cout<<"catch unknown"; }
  38.  
  39. std::vector<std::string> strings{ "123", "12.3", "", " ", "abc", " 123", "123 ", "12 3", "-1", "a", "A" };
  40. for (auto& str : strings)
  41. {
  42. std::cout << std::endl << "from_string(\'" << str << "\'):";
  43. try { std::cout << std::endl << "<string>: "; std::cout << from_string<std::string>(str); } _CATCH()
  44. try { std::cout << std::endl << "<double>: "; std::cout << from_string<double>(str); } _CATCH()
  45. try { std::cout << std::endl << "<int> : "; std::cout << from_string<int>(str); } _CATCH()
  46. try { std::cout << std::endl << "<char> : "; std::cout << from_string<char>(str); } _CATCH()
  47. std::cout << std::endl;
  48. }
  49.  
  50. return 0;
  51. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
from_string('123'):
<string>: 123
<double>: 123
<int>   : 123
<char>  : 1

from_string('12.3'):
<string>: 12.3
<double>: 12.3
<int>   : 12
<char>  : 1

from_string(''):
<string>: catch std::exception: basic_ios::clear: iostream error
<double>: catch std::exception: basic_ios::clear: iostream error
<int>   : catch std::exception: basic_ios::clear: iostream error
<char>  : catch std::exception: basic_ios::clear: iostream error

from_string(' '):
<string>: catch std::exception: basic_ios::clear: iostream error
<double>: catch std::exception: basic_ios::clear: iostream error
<int>   : catch std::exception: basic_ios::clear: iostream error
<char>  :  

from_string('abc'):
<string>: abc
<double>: catch std::exception: basic_ios::clear: iostream error
<int>   : catch std::exception: basic_ios::clear: iostream error
<char>  : a

from_string(' 123'):
<string>: catch std::exception: basic_ios::clear: iostream error
<double>: catch std::exception: basic_ios::clear: iostream error
<int>   : catch std::exception: basic_ios::clear: iostream error
<char>  :  

from_string('123 '):
<string>: 123
<double>: 123
<int>   : 123
<char>  : 1

from_string('12 3'):
<string>: 12
<double>: 12
<int>   : 12
<char>  : 1

from_string('-1'):
<string>: -1
<double>: -1
<int>   : -1
<char>  : -

from_string('a'):
<string>: a
<double>: catch std::exception: basic_ios::clear: iostream error
<int>   : catch std::exception: basic_ios::clear: iostream error
<char>  : a

from_string('A'):
<string>: A
<double>: catch std::exception: basic_ios::clear: iostream error
<int>   : catch std::exception: basic_ios::clear: iostream error
<char>  : A