C++: reference wrappers and printf -
i have std::vector
of std::reference_wrapper
objects want print printf (without cout); now, if write
int a=5; std::reference_wrapper<int> b=a; printf("%i\n\n",b);
i nosense number (i think address of a
); obtain value have do
printf("%i\n\n",b.get());
is there way have automatic call .get()
function in printf
(e.g. different %
specificator print me reference_wrapper content
) can make generalized function works both std::reference_wrapper<type>
, type
?
you want @ least consider using c++ io library instead of legacy c functions. being said, can write wrapper around printf
provide unwrapping of reference wrappers:
template<typename... params> void my_printf(char const* fmt, params&&... ps) { printf(fmt, unwrap(std::forward<params>(ps))...); }
with unwrap
implemented follows:
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>>{}); }
and is_reference_wrapper
trait:
template<typename t> struct is_reference_wrapper : std::false_type {}; template<typename t> struct is_reference_wrapper<std::reference_wrapper<t>> : std::true_type{};
Comments
Post a Comment