Real World usage of D, Today (was Re: challenge #2: implement the varargs_reduce metafunction)

Sean Kelly sean at f4.ca
Sat Jan 27 09:34:48 PST 2007


Andrei Alexandrescu (See Website For Email) wrote:
> Kevin Bealer wrote:
>> Andrei Alexandrescu (See Website For Email) wrote:
> [about deducing storage types]
>>> The syntax that I am proposing does away with storageof and is very 
>>> much in spirit with the current D:
>>>
>>> S int foo(S, T)(S T t) { }
>>>
>>> It does exactly what it says it does, in a clear and terse manner, 
>>> and is 100% within the spirit of existing D:
>>>
>>> * It's customized on symbols S and T
>>>
>>> * It's matching (by sheer position of S and T) the storage (i.e., all 
>>> of the gooey fuzzy nice information about the argument passed) and 
>>> the type of the incoming argument
>>>
>>> * In this example it uses the storage in the result type (e.g. const 
>>> goes to const)
>>>
>>> * Inside the function can easily use either T separately or S T as a 
>>> group that transports the storage around. You have total flexibility 
>>> (and don't forget that juxtaposition is always easier than extraction).
>>>
>>> So far we're only thinking of storage-like attributes, but a good 
>>> deal of information can be encoded under the loose declaration of 
>>> "storage".
>>>
>>>
>>> Andrei
>>
>> I like this; does this mean that when declaring an instance, you would 
>> do something like this?  Or do the 'const' parts get deduced?
>>
>> alias Foo!(const, int) TheFoo;
> 
> The intent is to deduce the storage, but specifying it explicitly works 
> just as well.
> 
> There is strong resistance against my notation because manipulating the 
> storage class separately is something entirely new, which means a lot of 
> work in the compiler implementation. Also, S is not a type but a (new 
> kind of) alias, which might confuse people who read:
> 
> template Foo(S, T)
> {
>   ...
> }
> 
> and expect S and T to be types, just to discover in the body of the 
> template that S is actually a qualifier.
> 
> The strawman we're discussing now looks like this:
> 
> void foo(auto T)(T t) { }
> 
> meaning, T will match whatever you throw at foo, including storage:
> 
> int a = 5;
> foo(a);     // T == inout int
> foo(a + 1); // T == int

So how would one declare such a type?  typeof(T) perhaps?  I imagine 
there must be some way to separate the storage class from the type for 
this to work.


Sean



More information about the Digitalmars-d mailing list