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