using namespace fmt=boost::format; struct timeval tv; gettimeofday(&tv, NULL); // formatter with default context (no context spec) // this means you can't do -- fmt("%{i}",x) for i->[0,n) where x={x0..xn} (data memebers) fmt::formatter default_fmt; // (x) (y) std::cout << default_fmt("(%d) (%d)", tv.tv_sec, tv.tv_usec) << std::endl; // (x seconds) (y microseconds) std::cout << default_fmt("(%d) (%d)", fmt::unit(tv.tv_sec), fmt::unit(tv.tv_usec)) << std::endl; // (x sec) (y usec) std::cout << default_fmt("(%d) (%d)", fmt::unit(tv.tv_sec), fmt::unit(tv.tv_usec)) << std::endl; // (x s) (y usec) std::cout << default_fmt("(%d) (%d)", fmt::unit >(tv.tv_sec), fmt::unit(tv.tv_usec)) << std::endl; typedef fmt::context_adapter< timeval, fmt::context_spec< fmt::context_element, //timeval::*>, fmt::context_element > > timeval_context_t; fmt::basic_formatter timeval_fmt(&timeval::tv_sec, &timeval::tv_usec); // Output the first, then the second context elements std::cout << timeval_fmt("%{1}:%{2}",tv) << std::endl; typedef fmt::context_adapter< timeval, fmt::context_spec< fmt::context_element<'s', int timeval::*>, //timeval::*>, fmt::context_element<'u', int timeval::*> > > custom_code_timeval_context_t; fmt::basic_formatter custom_fmt(&timeval::tv_sec, &timeval::tv_usec); // Output tv_sec then tv_usec std::cout << custom_fmt("%s:%u",tv) << std::endl; fmt::basic_formatter custom_fmt_units( fmt::unit(&timeval::tv_sec), fmt::unit(&timeval::tv_usec)); // Output "(x seconds) (y microseconds)" for tv_sec=x, tv_usec=y std::cout << custom_fmt("(%s) (%u)",tv) << std::endl;