实现简单的花括号插值打印
#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 函数的逻辑。