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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值