• type safe printf


    在书里看到的,摘录如下:

    #include <iostream>
    #include <stdexcept>
    
    template<class T> struct is_C_style_string:std::false_type{};
    template<> struct is_C_style_string<char*>:std::true_type{};
    template<> struct is_C_style_string<const char*>:std::true_type{};
    void printf_ts(const char* s){
        if(s == nullptr)return;
        while(*s){
            if(*s=='%' && *++s!='%')
                throw std::runtime_error("invalid format:missing arguments");
            std::cout << *s++;
        }
    }
    
    template<typename T, typename... Args>
    void printf_ts(const char*s, T value, Args... args){
        while(s && *s){
            if(*s == '%' && *++s != '%'){
                std::cout << value;
                return printf_ts(++s, args...);
            }
            std::cout << *s++;
        }
        throw std::runtime_error("Extra arguments provided to printf_ts");
    };
    
    template<typename T, typename... Args>
    void printf_ts(const char* s, T value, Args... args){
        while(s && *s){
            if(*s == '%'){
                switch(*++s){
                    case '%':
                        break;
                    case 's':
                        if(!is_C_style_string<T>::value)
                            throw std::runtime_error("Bad printf() format");
                        break;
                    case 'd':
                        if(!std::is_integral<T>::value)
                            throw std::runtime_error("Bad printf() format");
                        break;
                    case 'g':
                        if(!std::is_floating_point<T>::value)
                            throw std::runtime_error("Bad printf() format");
                        break;
                }
                std::cout << value;
                return printf_ts(++s, args...);
            }
            std::cout << *s++;
        }
        throw std::runtime_error("extra arguments provided to printf");
    };
    
    
    
    
    int main() {
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }
    

      

  • 相关阅读:
    使用BeyondCompare作为Subversive的比较器
    Ubuntu下安装jdk6的方法和步骤
    推荐几款通用的数据库管理工具
    通用数据库都有哪些
    Linux下卸载ORACLE的多种方法(参考使用)
    jar包查询网站 非常好用!
    8种Nosql数据库系统对比
    SQL2005数据库镜像的步骤
    建立与删除SQL 2008事务复制发布
    同步复制JOB说明
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4674446.html
Copyright © 2020-2023  润新知