Gennaro Prota <[EMAIL PROTECTED]> writes:

> On Sun, 02 Feb 2003 08:35:56 -0500, David Abrahams
> <[EMAIL PROTECTED]> wrote:
>
>>> This of course works, but the typedef name is quite "log specific";
>>> certainly that's worse than having a generic name available at class
>>> scope:
>>>
>>>
>>>    template <...>
>>>    struct static_log2 {
>>>      typedef ... argument_type;    // (*)
>>>    };
>>>
>>>
>>> As Terje Slettebų noticed in private mail, this is a general problem
>>> for any 'compile-time function'. 
>>
>>("metafunction")
>
> Well, the term 'compile-time function' was mine, so if it is an
> error

It's not an error; I was just trying to say that they're equivalent
terms, for clarity.

> it is my fault, not Terje's. Maybe I'm not aligned to the standard
> terminology, but to me the prefix meta- means "that refers to
> something of its same nature", thus for instance a meta-sentence is a
> sentence that talks about sentences, a metarule is a rule about rules
> and a metaprogram is a program that generates a program. Since a class
> template doesn't generate a function 

It can, but not the ones we're discussing.

> I don't call it a metafunction, though of course if you intend
> 'function' in a wider meaning then you can do that as well.

No, I intend "meta-" in the wider meaning of "of or related to
metaprogramming."  It's a lot easier to discuss metafunctions and
metadata than compile-time functions, and types, integral constants,
templates, constant pointers and references, pointers and references
to functions, and pointers to members (whew! did I forget anything?)

As long as we're in the domain of metaprogramming, I think it makes
sense to adopt a few linguistic shorthands (i.e. domain-specific
jargon).

> Yes, but it's quite overkilling in this case. At a point, you have to
> balance the generality with the complexity cost (not to talk, in this
> case, about compile times).

You're the one who brought up generality ;-).  It's easy enough to get
the speed back by using specializations.

> Sorry, I should have been clearer. The idea was to use a non-intrusive
> way to gather the argument type of a generic unary 'metafunction'. The
> template argument_type<>, to be specialized as needed, provided a
> uniform interface for that; for instance:
>
>    template <typename T>
>    struct argument_type;
>
>    template <>
>    struct argument_type<MyMetaFunction> {
>      typedef ... type;
>    };


Ah.  Well, there's no way to do what you want in general.  That's just
one among many very good reasons that MPL metafunctions use a truly
polymorphic interface, operating just on types.  If metafunctions
aren't themselves polymorphic, you can't do this kind of detection.

> For static_log2 you would specialize it as:
>
>    template < unsigned long x > 
>    struct argument_type< static_log2<x> > { 
>      typedef unsigned long type;
>
>    };
>
>
> That, however, still requires you to specify a number (whatever it is)
> when requiring the argument type:
>
>   argument_type < static_log2<16> > :: type

I don't even think it works.  Throwing this at Comeau online:

    template <unsigned long N> 
    struct static_log2 {};

    template <class T> 
    struct argument_type;

    template < unsigned int x > // ***
    struct argument_type< static_log2<x> > { 
      typedef unsigned long type;
    };

Yeilds:

    "ComeauTest.c", line 6: error: constant "x" is not used in template argument list
              of class template "argument_type<static_log2<x>>"
         template < unsigned int x > 
                                 ^

But this works again if I change *** to unsigned long.  None of my
other compilers agree, but I am inclined to believe EDG.  Why should
it be any different from substituting "class x" at ***?

> whereas I think the intuitive syntax would be:
>
>   argument_type < static_log2<> > :: type
>
> To get the intuitive syntax, you can't use a default value in the
> specialization of argument_type, simply because that's illegal. But
> you could, if you really strive for it at all costs, use a default
> (=0) for static_log2 itself. How ugly (and ad-hoc) that would be is
> evident to everyone, so I was just, to say, thinking out loud in the
> hope that it could suggest other ideas.

IMO, unless EDG is wrong you're going to have to use types if you want
to generalize it.

-- 
                       David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to