【发布时间】:2017-12-29 01:55:58
【问题描述】:
所以我正在尝试构建一个“清理器”函数来过滤格式化参数,然后再将它们转发到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)...);
}
我希望将参数完美地转发到printf,这就是我返回std::forward的原因。但我无法真正理解这应该如何实现。
1) decltype(auto) 正确吗?应该保留std::forward返回的r值引用性吧?
2) 我应该如何专门化我的模板:std::string&& 或 std::string?
3) 推导出的转发引用应该和实际的类型一样吧?
【问题讨论】:
-
printf不需要转发。 -
但是我们假设 printf 是一些内部日志功能,应该如何实现呢?另外为什么不需要转发参数?