C++11 字符串與數字互轉

#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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章