#pragma once
#ifndef _STRING_CONVERT
#define _STRING_CONVERT
#include <string>
template<class T>
std::string toString(const T &t)
{
std::stringstream os;
os.precision(16);
os << t;
return os.str();
}
template<class To>
typename std::enable_if<std::is_floating_point<To>::value, To>::type fromString(const std::string &t, To def)
{
if (t.empty()) return def;
return (To)atof(t.c_str());
}
template<class To>
typename std::enable_if<std::is_floating_point<To>::value, To>::type fromString(const std::string &t)
{
return (To)atof(t.c_str());
}
template<class To>
typename std::enable_if<std::is_integral<To>::value, To>::type fromString(const std::string &t, To def)
{
if (t.empty()) return def;
if (t.length() >= 19)
{
if (typeid(To) == typeid(unsigned long long))
{
char *cursor = nullptr;
return (To)strtoull(t.c_str(), &cursor, 10);
}
}
return (To)atoll(t.c_str());
}
template<class To>
typename std::enable_if<std::is_integral<To>::value, To>::type fromString(const std::string &t)
{
if (t.length() >= 19)
{
if (typeid(To) == typeid(unsigned long long))
{
char *cursor = nullptr;
return (To)strtoull(t.c_str(), &cursor, 10);
}
}
return (To)atoll(t.c_str());
}
template<class To>
typename std::enable_if<std::is_pointer<To>::value, To>::type fromString(const std::string &t, To def)
{
if (t.empty()) return def;
return t.c_str();
}
template<class To>
typename std::enable_if<std::is_pointer<To>::value, To>::type fromString(const std::string &t)
{
return t.c_str();
}
template<class To>
typename std::enable_if<std::is_class<To>::value, To>::type fromString(const std::string &t, To def)
{
if (t.empty()) return def;
return t;
}
template<class To>
typename std::enable_if<std::is_class<To>::value, To>::type fromString(const std::string &t)
{
return t;
}
template<class To>
typename std::enable_if<std::is_class<To>::value, To>::type fromString(std::string &&t, To def)
{
if (t.empty()) return def;
return std::move(t);
}
template<class To>
typename std::enable_if<std::is_class<To>::value, To>::type fromString(std::string &&t)
{
return std::move(t);
}
#endif // _STRING_CONVERT