zoukankan      html  css  js  c++  java
  • 字符串转化到实数

    这是练习std::enable_if ,std::is_same 和 std::decay 的例子。
    用来做字符串转化的泛型有些牵强,实际上这块用函数模版特化可能会更合适。
    至于什么时候用std::enable_if 看《C++程序设计语言》的元编程讲std::enable_if有个更合适的例子。
     1 #include <string>
     2 #include <type_traits>
     3 namespace detail {
     4     template<class T, class Enable = void>
     5     struct ConvertToNumeric
     6     {
     7         T operator()(const std::string& str) const
     8         {
     9             return std::stoi(str);
    10         }
    11     };
    12     //special cases
    13     template< bool B, class T>
    14     using T_enable_if_t = typename std::enable_if<B,T>::type;
    15     template<class U, class T>
    16     using T_same_enable_t = T_enable_if_t<std::is_same<T,U>::value, T>;
    17     template<class T>
    18     struct ConvertToNumeric<T, T_same_enable_t<long, T>>
    19     {
    20         long operator()(const std::string& str) const
    21         {
    22             return std::stol(str);
    23         }
    24     };
    25     template<class T>
    26     struct ConvertToNumeric<T, T_same_enable_t<unsigned long, T>>
    27     {
    28         unsigned long operator()(const std::string& str) const
    29         {
    30             return std::stoul(str);
    31         }
    32     };
    33     template<typename T>
    34     struct ConvertToNumeric<T, T_same_enable_t<long long, T>>
    35     {
    36         long long operator()(const std::string& str) const
    37         {
    38             return std::stoll(str);
    39         }
    40     };
    41     template<typename T>
    42     struct ConvertToNumeric<T, T_same_enable_t<unsigned long long, T>>
    43     {
    44         unsigned long long operator()(const std::string& str) const
    45         {
    46             return std::stoull(str);
    47         }
    48     };
    49     template<typename T>
    50     struct ConvertToNumeric<T, T_same_enable_t<float, T>>
    51     {
    52         float operator()(const std::string& str) const
    53         {
    54             return std::stof(str);
    55         }
    56     };
    57     template<typename T>
    58     struct ConvertToNumeric<T, T_same_enable_t<double, T>>
    59     {
    60         double operator()(const std::string& str) const
    61         {
    62             return std::stod(str);
    63         }
    64     };
    65     template<typename T>
    66     struct ConvertToNumeric<T, T_same_enable_t<long double, T>>
    67     {
    68         long double operator()(const std::string& str) const
    69         {
    70             return std::stold(str);
    71         }
    72     };
    73 }
    74 //this complex way, also use function template specialization
    75 /*****************************************/
    76 /*
    77 template<typename T>
    78 inline T str_to_numeric(const std::string& str)
    79 {
    80     return std::stoi(str);
    81 }
    82 template<>
    83 inline long str_to_numeric<long>(const std::string& str)
    84 {
    85     return std::stol(str);
    86 }
    87 ...
    88 */
    89 template<typename T>
    90 inline T str_to_numeric(const std::string& str)
    91 {
    92     using  T_decay_t = typename std::decay<T>::type;
    93     return detail::ConvertToNumeric<T_decay_t, T_decay_t>()(str);
    94 }
    View Code
  • 相关阅读:
    网络编程
    常用模块补充
    面向对象进阶
    面向对象 --- 封装
    面向对象 三大特性--多态
    python 面向对象三大特性
    python 面向对象
    python 模块与包
    如何在Word的方框中打对号
    关于VS 2013连接Microsoft Access 2013的相关问题
  • 原文地址:https://www.cnblogs.com/water-bear/p/11940461.html
Copyright © 2011-2022 走看看