Thread overview
isSame/TemplateOf bug?
Feb 19, 2019
SrMordred
Feb 19, 2019
Paul Backus
Feb 19, 2019
SrMordred
Feb 20, 2019
Ali Çehreli
February 19, 2019
import std.traits;
import std.stdio;

struct Test(T)
{
	this(T)( auto ref T value )
	{
                writeln( TemplateOf!(typeof(value)).stringof);
		writeln(  __traits(isSame, TemplateOf!(typeof(value)), Test) );
	}
}

void main(){
	auto value = Test!int(Test!int());

        writeln( TemplateOf!(typeof(value)).stringof);
	writeln( __traits(isSame, TemplateOf!(typeof(value)), Test) );
}

//output:

Test(T)
false
Test(T)
true


February 19, 2019
On Tuesday, 19 February 2019 at 22:43:25 UTC, SrMordred wrote:
> import std.traits;
> import std.stdio;
>
> struct Test(T)
> {
> 	this(T)( auto ref T value )
> 	{
>                 writeln( TemplateOf!(typeof(value)).stringof);
> 		writeln(  __traits(isSame, TemplateOf!(typeof(value)), Test) );
> 	}
> }
>
> void main(){
> 	auto value = Test!int(Test!int());
>
>         writeln( TemplateOf!(typeof(value)).stringof);
> 	writeln( __traits(isSame, TemplateOf!(typeof(value)), Test) );
> }
>
> //output:
>
> Test(T)
> false
> Test(T)
> true

Inside a templated struct, the name of the template, by itself, actually refers to the current instantiation. So when you write `Test` in your __traits(isSame) test, the compiler interprets it as `Test!T`.
February 19, 2019
On Tuesday, 19 February 2019 at 23:03:37 UTC, Paul Backus wrote:
> On Tuesday, 19 February 2019 at 22:43:25 UTC, SrMordred wrote:
>> import std.traits;
>> import std.stdio;
>>
>> struct Test(T)
>> {
>> 	this(T)( auto ref T value )
>> 	{
>>                 writeln( TemplateOf!(typeof(value)).stringof);
>> 		writeln(  __traits(isSame, TemplateOf!(typeof(value)), Test) );
>> 	}
>> }
>>
>> void main(){
>> 	auto value = Test!int(Test!int());
>>
>>         writeln( TemplateOf!(typeof(value)).stringof);
>> 	writeln( __traits(isSame, TemplateOf!(typeof(value)), Test) );
>> }
>>
>> //output:
>>
>> Test(T)
>> false
>> Test(T)
>> true
>
> Inside a templated struct, the name of the template, by itself, actually refers to the current instantiation. So when you write `Test` in your __traits(isSame) test, the compiler interprets it as `Test!T`.

True!
writeln(Test.stringof) inside the struct give me Test!int.

Thanks!

Little unexpected D dark corner :P
February 19, 2019
On 02/19/2019 03:21 PM, SrMordred wrote:
> On Tuesday, 19 February 2019 at 23:03:37 UTC, Paul Backus wrote:

>> Inside a templated struct, the name of the template, by itself,
>> actually refers to the current instantiation. So when you write `Test`
>> in your __traits(isSame) test, the compiler interprets it as `Test!T`.
>
> True!
> writeln(Test.stringof) inside the struct give me Test!int.
>
> Thanks!
>
> Little unexpected D dark corner :P

For reference, it is the same in C++.

Ali