模仿 C 的 `printf`,但利用 C++ 可變參模板實現**編譯期類型檢查**,避免運行期格式字符串與參數不匹配導致崩潰。
#include <iostream>
#include <typeinfo>
#include <cstring>
using namespace std;
// 基礎情況:無參數
void my_printf(const char *fmt) {
cout << fmt;
}
// 遞歸模板
template <typename T, typename... Args>
void my_printf(const char *fmt, T value, Args... args) {
if (!fmt || *fmt == '\0') return;
if (*fmt == '%') {
++fmt;
// 類型檢查示例(可擴展)
if (*fmt == 'd') {
if (strcmp(typeid(T).name(), "i") != 0) {
cerr << "Type mismatch: %d expects int\n";
return;
}
} else if (*fmt == 's') {
if (strcmp(typeid(T).name(), "PKc") != 0 && strcmp(typeid(T).name(), "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE") != 0) {
cerr << "Type mismatch: %s expects string\n";
return;
}
}
cout << value;
my_printf(++fmt, args...);
} else {
cout << *fmt;
my_printf(++fmt, value, args...);
}
}
int main() {
my_printf("Hello %s, answer = %d\n", "World", 42);
// my_printf("Error %d\n", "not int"); // 編譯通過但運行期報錯
return 0;
}