Skip to content

Instantly share code, notes, and snippets.

@ranisalt
Created April 11, 2016 18:54
Show Gist options
  • Save ranisalt/7bb2af8b7fa21dd7eeb2b4e8f7aef156 to your computer and use it in GitHub Desktop.
Save ranisalt/7bb2af8b7fa21dd7eeb2b4e8f7aef156 to your computer and use it in GitHub Desktop.
lexical cast in C++11
/* 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