#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;
}