about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-05-11T15·06+0200
committerEelco Dolstra <edolstra@gmail.com>2017-05-15T15·36+0200
commit2b761d5f50b7dc17dc55c31980c2253c37b3c920 (patch)
tree48fa396d4ddc2eb7348c213dbd59c08404ca64e3
parent0124d118ef6718716f740ebfd3ae5eff0453be9e (diff)
Make fmt() non-recursive
-rw-r--r--src/libutil/logging.hh2
-rw-r--r--src/libutil/types.hh17
2 files changed, 7 insertions, 12 deletions
diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh
index 81aebccdca45..a8c69dbd956d 100644
--- a/src/libutil/logging.hh
+++ b/src/libutil/logging.hh
@@ -88,7 +88,7 @@ template<typename... Args>
 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 1429c238513b..9f32d31addbf 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<typename... T> 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<typename T, typename... Args>
-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<typename... Args>
 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();
 }