您可能至少要考虑使用 C++ IO 库而不是旧的 C 函数。话虽如此,您可以编写一个包装器printf
来提供引用包装器的解包:
template<typename... Params>
void my_printf(char const* fmt, Params&&... ps)
{
printf(fmt, unwrap(std::forward<Params>(ps))...);
}
实施unwrap
如下:
template<typename T>
decltype(auto) unwrap_impl(T&& t, std::false_type){
return std::forward<T>(t);
}
template<typename T>
decltype(auto) unwrap_impl(T&& t, std::true_type){
return t.get();
}
template<typename T>
decltype(auto) unwrap(T&& t)
{
return unwrap_impl(std::forward<T>(t), is_reference_wrapper<std::decay_t<T>>{});
}
和is_reference_wrapper
特点:
template<typename T>
struct is_reference_wrapper : std::false_type {};
template<typename T>
struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type{};
演示