Created
April 11, 2016 18:54
-
-
Save ranisalt/7bb2af8b7fa21dd7eeb2b4e8f7aef156 to your computer and use it in GitHub Desktop.
lexical cast in C++11
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* fallback */ | |
template<class T> | |
T lexical_cast(const char* str) | |
{ | |
static std::istringstream ss; /* reusing has severe (positive) impact on performance */ | |
T value; | |
ss.str(str); | |
ss >> value; | |
ss.clear(); | |
return value; | |
} | |
/* trivial conversion */ | |
template<> std::string lexical_cast(const char* str) { return str; } | |
/* conversions that exist in stl */ | |
template<> float lexical_cast(const char* str) { return std::strtof(str, nullptr); } | |
template<> long lexical_cast(const char* str) { return std::strtol(str, nullptr, 0); } | |
template<> long long lexical_cast(const char* str) { return std::strtoll(str, nullptr, 0); } | |
template<> unsigned long lexical_cast(const char* str) { return std::strtoul(str, nullptr, 0); } | |
template<> unsigned long long lexical_cast(const char* str) { return std::strtoull(str, nullptr, 0); } | |
/* conversions that need to be truncated */ | |
template<> short lexical_cast(const char* str) { return static_cast<short>(lexical_cast<long>(str)); } | |
template<> int lexical_cast(const char* str) { return static_cast<int>(lexical_cast<long>(str)); } | |
template<> unsigned short lexical_cast(const char* str) { return static_cast<unsigned short>(lexical_cast<unsigned long>(str)); } | |
template<> unsigned int lexical_cast(const char* str) { return static_cast<unsigned int>(lexical_cast<unsigned long>(str)); } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment