www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - isSame/TemplateOf bug?

reply SrMordred <patric.dexheimer gmail.com> writes:
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
Feb 19 2019
parent reply Paul Backus <snarwin gmail.com> writes:
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`.
Feb 19 2019
parent reply SrMordred <patric.dexheimer gmail.com> writes:
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
Feb 19 2019
parent =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
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
Feb 19 2019