C++0xのVariadic Templatesで型安全なprintf

Variadic Templatesの解説はこちら


Variadic Templatesの解説ではよく型安全なprintfが例に出されるのでここでも紹介しておこう

void printf(const char* s) {
    while (*s) {
        if (*s == '%' && *++s != '%')
            throw std::runtime_error("invalid format string: missing arguments");

        std::cout << *s++;
    }
}

template <typename T, typename... Args>
void printf(const char* s, const T& value, const Args&... args) { 
    while (*s) { 
        if (*s == '%' && *++s != '%') {
            std::cout << value;
            return printf(++s, args...);
        }

        std::cout << *s++;
    }
    throw std::runtime_error("extra arguments provided to printf");
}
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string name = "Akira";
    int    age  = 22;

    printf("%s,%d\n", name, age);
    return 0;
}

%03dとかできねーじゃん!っていう突っ込みはなしでおねがいします