Static strings in templates

downs default_357-line at yahoo.de
Fri May 2 03:56:45 PDT 2008


Leonard Dahlmann wrote:
> Janice Caron Wrote:
> 
>> I don't know if this is a bug or not. Someone please help me out.
>> Here's the deal. Suppose I declare:
>>
>>     int foo(T)(T s, T t)
>>
>> with the expectation that the template will be passed a couple of
>> strings, wstrings or dstring. All works fine if I do
>>
>>     string s;
>>     string t;
>>     int n = foo(s,t);
>>
>> However, the template can't be instantiated with
>>
>>     int n = foo("abcde","fg");
>>
>> because the type of the first argument is invariant(char)[5u], and the
>> type of the second argument is invariant(char)[2u], and the compiler
>> can't figure out that both can (and should) be implicitly cast to
>> invariant(char)[].
>>
>> It occurs to me that even with only a single parameter, passing string
>> literals to templated string function will lead to a lot of template
>> bloat, if the template always considers the argument type to be
>> invariant(char)[N] (for some N), as opposed to simply
>> invariant(char)[].
>>
>> Is this a bug? Can anything be done about this? Is there a workaround?
> 
> I think a workaround is to use downs' Unstatic template.
> Given a static array type, it returns the corresponding dynamic array type.
> 
>     template Unstatic(T) { alias T Unstatic; }
>     template Unstatic(T : T[]) { alias T[] Unstatic; }
> 
>     int foo(T)(Unstatic!(T) s, Unstatic!(T) t)
> 

A better way may be to accept _any_ parameter, as in, int foo(T...)(T stuff);

Then check if is(typeof(stuff[0][]) == typeof(stuff[1][])), else static assert(false, "Parameters don't expose full slices of the same type!");

Using unstatic probably breaks ifti. Although, I haven't tested it. ^^

 --downs



More information about the Digitalmars-d mailing list