
On 03/10/08 13:16, Larry Evans wrote:
On 03/10/08 12:08, Eric Niebler wrote:
Markus Werle wrote:
Steven Watanabe <watanabesj <at> gmail.com> writes:
The definition of expr is something like:
template<class Tag, class Args, int Arity = Args::arity> struct expr; [snip] OK, and what is the advantage of the 3rd template argument Arity then? AFAICS this is needed for the BOOST_PP_ITERATION magic, but strictly speaking it is not necessary for the data _representation_, right? You have to partially specialize on *something*. That's what the 3rd template parameter is for. This is not something I can remove. I can't get the design I need without it.
Couldn't you use a helper template, e.g. expr_arity, *with* the third parameter = size<Args>::value and then expr_arity is specialized on that last arg? OOPS, then you'd be the same place you are now with an the 2 arg expr and the 3 arg expr_arity specialized the same number of times as the existing 3 arg expr. Since there no gain is ability be extra templates, the better solution is the existing 3 arg expr with specialization on last arg. IOW, I kinda agree with Eric here.
What about recording the arity *with* the tag instead of in the expression associated with the tag? IOW, instead of: expr<Tag,Args,Arity> have: expr<tag_arity<Tag,Arity>,Args> Why? Well, it directly associates the arity with the Tag instead of with the expression. After all, sin(X) is not expressed as sin(x,1). [or in lisp terms, (sin x) is not expressed as (sin x 1) ].