Thread overview | ||||||
---|---|---|---|---|---|---|
|
February 19, 2019 isSame/TemplateOf bug? | ||||
---|---|---|---|---|
| ||||
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 Re: isSame/TemplateOf bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to SrMordred | 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 Re: isSame/TemplateOf bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Backus | 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 Re: isSame/TemplateOf bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to SrMordred | 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 |
Copyright © 1999-2021 by the D Language Foundation