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

  

时间: 2024-10-10 14:31:09

type safe printf的相关文章

14年12月份文章回顾

Getting Started with Robots for kids and children (hanselman.com) https://news.ycombinator.com/item?id=8811056 Nim Programming Language Tutorial (nim-lang.org) https://news.ycombinator.com/item?id=8810131 A Gentle Introduction to Data Compression (be

awesome-modern-cpp

Awesome Modern C++ A collection of resources on modern C++. The goal is to collect a list of resouces to help people learn about and leverage modern C++11 and beyond. Contributing To add, remove or change things on the list: please submit a pull requ

2017/03/27学习笔记

程序的输入是指从输入文件讲数据传送给程序,程序的输出是指从程序将数据传送输出文件.C++输入输出包含以下三方面内容:对系统指定标准设备的输入和输出.即从键盘输入数据,输出到显示器.这种输入输出称为标准输入输出,简称标准IO.以外出磁盘文件为对象进行输入输出,即从磁盘文件输入数据,将数据输出到文件.以外存为对象的输入输出称为文件的输入输出,简称文件IO.度内存中指定的空间进行输入输出,通常指定一个字符串数组作为储存空间(实际上可以利用该空间储存任何信息).这种输入输出称为字符串输入输出,简称串IO

golang中channels的本质详解,经典!

原文:https://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html The Nature Of Channels In Go 这篇文章关于channel讲解得非常好,深度形象.深入浅出.尤其是这两幅图,太厉害了.非常清楚,一目了然. --------------------------------------------------------------------------------------------------

c/c++:回调函数

1:函数名为指针 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针的类型.如: 1 #include<stdio.h> 2 3 void fun() 4 { 5 } 6 7 int main() 8 { 9 printf("%p %p %p\n", &fun, fun, *fun); 10 return 0; 11 } 这三个值的结果是一样的. 其实对于最后的那个*fun, 即使前面加上很多个*号, 其结果

Google C++ 代码规范

Google C++ Style Guide Table of Contents Header Files Self-contained Headers The #define Guard Forward Declarations Inline Functions Names and Order of Includes Scoping Namespaces Unnamed Namespaces and Static Variables Nonmember, Static Member, and

C++学习42 输入和输出的概念

我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常用磁盘(光盘)作为输入输出对象,磁盘文件既可以作为输入文件,也可以作为输出文件. 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件. C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到显示器屏幕.这种输入输出称为标

C++ Core Guidelines

C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very early draft. It is inkorrekt, incompleat, and pµøoorly formatted. Had it been an open source (code) project, this would have been release 0.6. Copy

Boost 的C++ 格式化输出函式库:Format

他最大的特色是在于它可以使用C 语言中printf 的格式化字串,来针对C++ 的iostream 做输出.或是产生格式化的字串:相较于C++ iostream 的manipulator,boost::format 在使用上更为直觉.简单. 而且和printf 不同的地方在于,他又有C++ iostream 的type safe.可以支持自定义类型的输出 官方网站的介绍可以参考: http://www.boost.org/doc/libs/1_44_0/libs/format/index.htm