From 2b761d5f50b7dc17dc55c31980c2253c37b3c920 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 11 May 2017 17:06:07 +0200 Subject: [PATCH] Make fmt() non-recursive --- src/libutil/logging.hh | 2 +- src/libutil/types.hh | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 81aebccdc..a8c69dbd9 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -88,7 +88,7 @@ template inline void warn(const std::string & fs, Args... args) { boost::format f(fs); - formatHelper(f, args...); + nop{boost::io::detail::feed(f, args)...}; logger->warn(f.str()); } diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 1429c2385..9f32d31ad 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -32,6 +32,11 @@ using std::vector; using boost::format; +/* A variadic template that does nothing. Useful to call a function + for all variadic arguments but ignoring the result. */ +struct nop { template nop(T...) {} }; + + struct FormatOrString { string s; @@ -46,16 +51,6 @@ struct FormatOrString ... a_n’. However, ‘fmt(s)’ is equivalent to ‘s’ (so no %-expansion takes place). */ -inline void formatHelper(boost::format & f) -{ -} - -template -inline void formatHelper(boost::format & f, T x, Args... args) -{ - formatHelper(f % x, args...); -} - inline std::string fmt(const std::string & s) { return s; @@ -75,7 +70,7 @@ template inline std::string fmt(const std::string & fs, Args... args) { boost::format f(fs); - formatHelper(f, args...); + nop{boost::io::detail::feed(f, args)...}; return f.str(); }