Boost logo

Boost :

From: Larry Evans (cppljevans_at_[hidden])
Date: 2008-03-20 21:14:20


On 03/20/08 19:11, Eric Niebler wrote:
> Larry Evans wrote:
>> On 03/20/08 18:10, Eric Niebler wrote:
>>> Tags don't have arities, expressions do.
>>> The arity of tag::function could be anything. The arity represents the
>>> number of children of an expression node. So the arity is a very real
>>> part of an expression.
>>>
>> So:
>>
>> expr<tag::shift_right, Args, 20>
>>
>> is a valid expression?
>
> If Args has 20 elements in it, sure.
>

Fair enough. That's a lotta freedom.
That also allows:

   expr<tag::shift_right, Args, 0>

I guess. However, I'd imagine some people would want
this restricted to just two elements, which could be
done with something like:

template<class Tag,int Arity>
struct tag_arity
{
  private:
     tag_arity(void)
     ;
     void operator=(tag_arity const&)
     ;
};

struct shift_right;

template<>
struct tag_arity<shift_right,2>
{
  public:
     tag_arity(void)
     {}
     void operator=(tag_arity const&)
     {}
};
tag_arity<shift_right,2> tag_shift_right_2;
tag_arity<shift_right,1> tag_shift_right_1;//fails compile

And now, if size<Args>::value is
restricted to the Arity in
tag_arity<shift_right,Arity> then it
would be restricted to 2.

Now to handle the case of function, just do:

struct function;

template<int Arity>
struct tag_arity<function,Arity>
{
  public:
     tag_arity(void)
     {}
     void operator=(tag_arity const&)
     {}
};

So anything with function will allow
any int value for size<Args>::value.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk