zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    spring core源码解读之ASM4用户手册翻译之一asm简介
    nginx启动,重启,关闭命令
    linux LVM分区查看dm设备
    jdbc 对sqlite的基本操作
    linux配置多个ip
    细说Linux下的虚拟主机那些事儿
    打造字符界面的多媒体Linux系统
    linux计划crontab
    因修改/etc/ssh权限导致的ssh不能连接异常解决方法
    Linux修改主机名
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4674446.html
Copyright © 2011-2022 走看看