バリデリックテンプレート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");
}
、どこでも、この実装はタイプセーフ(可変長引数のva_argで)通常のCがいない間であると言われています。
なぜですか? タイプセーフであることは何を意味し、C printf va_argに比べてこの実装にどのような利点がありますか?
このバージョンでは、フォーマットフラグについてはまったく気にせず、ストリーム演算子を介して印刷するだけです。 – Xeo
'T'は常に実際に渡されるパラメータの型であるという点で型安全です。標準printfはわかりません。 –
これは、ひどい型セーフな 'printf'実装です。これはフォーマット指定子を無視し、誤って解釈し、一時的な値の移動をサポートしません!要するに、これは型保証された関数ですが、その名前にもかかわらず 'printf'の有効な実装ではありません。型の良い 'printf'は、安全であれば' printf'と同じように動作し、ほとんど安全でない場合には未定義に失敗します。 – Yakk