Templates array detection
Ali Çehreli
acehreli at yahoo.com
Wed Dec 12 09:05:32 PST 2012
On 12/12/2012 07:37 AM, Cube wrote:
> On Wednesday, 12 December 2012 at 15:21:16 UTC, Ali Çehreli wrote:
>> On 12/12/2012 06:49 AM, Cube wrote:
>> > Better example code for my other problem. How can I make the
>> 3rd foo
>> > work on Datas?
>> >
>> > --
>> > struct Data(T)
>> > {
>> > T elem;
>> > }
>>
>> Data is a struct template, not a type (until instantiated).
>>
>> > void foo(T)(T t) if(is(T == Data)) // ?
>>
>> This works:
>>
>> void foo(T)(T t) if(is(T == Data!T))
>
> It doesn't seem to work for me, it uses the first foo. And I can't see
> how it would work, actually.
> If T is a Data!float, then wouldn't
> is(T == Data!T)
> be equal to
> is(Data!float == Data!Data!float)
> ?
I have to deal with the magical 'is expression' again! :p
First, also notice that you ar not passing Data!T but a pointer to
Data!T. This program works:
import std.stdio;
import std.traits;
struct Data(T)
{
T elem;
}
void main()
{
foo(1);
foo([1,1]);
auto tmp1 = new Data!(int);
tmp1.elem = 3;
foo(tmp1);
auto tmp2 = new Data!(string);
tmp2.elem = "hello";
foo(tmp2);
}
void foo(T)(T t) if(!isArray!T && !is(T ThisIsNeededButUnusable :
Data!U*, U))
{
writeln(t + 1);
}
void foo(T)(T t) if(isArray!T)
{
for(int i = 0; i < t.length; i++)
writeln(t[i]);
}
void foo(T)(T t) if (is(T ThisIsNeededButUnusable : Data!U*, U))
{
writeln("desired");
// Note that both of the 'if's are replaced with 'static if's.
// Also, both are 'pointers' in the conditionals.
static if(is(T == Data!int*))
writeln(t.elem + 1);
else static if(is(T == Data!string*))
writeln(t.elem);
}
I think ThisIsNeededButUnusable above is a compiler bug. It has a use
when the body of the 'is' is used inside template parameter lists but
not in a template constraint. It is still needed to satisfy the
syntax... (?)
Ali
More information about the Digitalmars-d-learn
mailing list