实现简单的花括号插值打印

#include <iostream>
void print(std::ostream &os, const char *s) {
    while (*s) {
        char ch = *s++;
        // Treat "{}" as a normal substring when no arguments are left
        // if (ch == '{' && *s == '}') {
        // }
        if ((ch == '{' && *s == '{') || (ch == '}' && *s == '}')) {
            os << *s++;
        } else {
            os << ch;
        }
    }
}

template <class A, class... Ts>
void print(std::ostream &os, const char *s, A &&a, Ts &&...args) {
    while (*s) {
        char ch = *s++;
        if (ch == '{' && *s == '}') {
            os << a;
            break;
        } else if ((ch == '{' && *s == '{') || (ch == '}' && *s == '}')) {
            os << *s++;
        } else {
            os << ch;
        }
    }
    if (*s) print(os, s + 1, std::forward<Ts>(args)...);
}

int main(int argc, char **argv) {
    std::cout << std::unitbuf;
    print(std::cout, "numbers : {} {} {}\\n", 10, 5, -7);
}

上面的写法依赖了 std::ostream,而且不支持格式指定符。如果能够构造一个模板类 PrintArg 包装 1 个任意类型参数和 1 个输出说明字符串,然后重载 std::ostream<< 操作符,那么可以不用动 print 函数的逻辑。