On Thu, Feb 9, 2012 at 1:13 AM, John M. Dlugosz <mpbecey7gu@snkmail.com> wrote:

I've not had much opportunity to do much template metaprogramming in my work, but I've kept up with my reading.  So, might I get some advice on how to approach this problem?

I'm thinking of an assert-like statement that follows the syntax of Boost.Format, thus avoiding the variadic argument list.

But, I want to avoid doing any work except on failure.  This means remembering the arguments including the following %arg stuff, and passing everything through to Boost.Format based on the condition.

This isn't metaprogramming -- or at least not new metaprogramming, rather taking advantage of an existing library -- but my colleague came up with what I consider a clever use of Boost.Lambda for a similar sort of problem. We wanted a macro with usage of the form:

OURMACRO("some streaming expr " << value << ...);

that would stream arbitrary objects as in:

hidden_ostream_object << "some streaming expr " << value << ...;

His solution is like this:

template <typename FUNCTOR>
void ourmacro_f(const FUNCTOR& f)
{
    f(hidden_ostream_object);
}

#define OURMACRO(EXPRESSION) (ourmacro_f(boost::lambda::_1 << EXPRESSION))
 
So, what approach should I use?
   Plain MPL and classic metaprogramming?
   Fusion?
   Phoenix?

In this case I guess Phoenix would be the way to go rather than Boost.Lambda.