私はprintf
に転送される前に書式設定引数をフィルタリングするための "サニタイザー"関数を構築しようとしています。テンプレートの特殊化と完璧な転送
template<typename A>
_CR_INLINE decltype(auto) sanitize_forward(A&& arg) {
return std::forward<A>(arg);
}
template<>
_CR_INLINE decltype(auto) sanitize_forward<std::string>(std::string&& arg) {
return std::forward<const char*>(arg.c_str());
}
だから、すべてのstd::string
が適切にフォーマットされるためには、const char*
に「崩壊」になっています。
template<typename...Args>
_CR_INLINE void printf_safe(const std::string& format, Args&&...args) {
std::printf(format.c_str(), sanitize_forward<Args>(args)...);
}
私は引数が、私はstd::forward
を返す理由である完全printf
から転送、なりたいです。しかし、私は実際にこれをどのように実装すべきかについて頭を落とすことはできません。
1)decltype(auto)
は正しいですか? std::forward
の戻り値のr値参照を保持する必要があります。
2)テンプレートを特化するにはどうすればいいですか:std::string&&
またはstd::string
?
3)推薦転送の参照は実際のタイプと同じである必要があります。
あなたは 'printf'に進む必要はありません。 –
しかし、printfが内部ログ機能であると仮定しましょう。これはどのように実装する必要がありますか?また、必要でない引数を正確に転送する理由は何ですか? – mutex36