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;
    }
    

      

  • 相关阅读:
    WinForm窗体传值 总结
    SQLServer遍历数据库所有表及统计表数据总数
    GridView合并行代码
    日期转换成字符串
    flex与js交互浅析
    九,query task
    八,graphics
    十,Find and Identity
    转移批令
    db dw dd 和 dup
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4674446.html
Copyright © 2011-2022 走看看