C++11 字符串与数字互转

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/how0723/article/details/84336377
#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

猜你喜欢

转载自blog.csdn.net/how0723/article/details/84336377