find difference between two struct instances.

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jul 21 18:04:48 PDT 2017


On Friday, 21 July 2017 at 23:38:51 UTC, FoxyBrown wrote:
> On Friday, 21 July 2017 at 22:35:20 UTC, Era Scarecrow wrote:
>> On Friday, 21 July 2017 at 21:03:22 UTC, FoxyBrown wrote:
>>> Is there a way to easily find the differences between to 
>>> struct instances? I would like to report only the differences
>>>
>>> e.g.,
>>>
>>> writeln(s1 - s2);
>>>
>>> prints only what is different between s1 and s2.
>>
>
> No, it isn't. It is a concept, wasn't mean to be taken as 
> literal D code.
>
>>  This is entirely dependent on the structs in question, you 
>> can't just subtract any struct from another struct unless it 
>> knows how to do it.
>>
>>  Depends on what the structures hold. You'll probably have to 
>> either make an opSub, a function to call opBinary!"-", or do 
>> opCmp which returns which is higher/lower (and may be as 
>> simple as subtraction).
>
> Why do I want to go through all that trouble? A simple binary 
> compare should suffice.

use opCmp in conjunction with __traits(allMembers,T)

struct Example
{
     int a,b,c;
     string d,e,f;
}

void difference(alias func, T)(T t1, T t2) if(__traits(compiles, 
func(t1,t2)))
{
     foreach(U; __traits(allMembers,T)
     {
         if (mixin("t1." ~ U.stringof~ ".opCmp(t2." ~ U.stringof 
~")")
             func(t1,t2);
     }

}

auto a =  Example(1,2,3,"foo","bar",baz");
auto a =  Example(1,2,42,"foo","bar",quux");

difference!(writeln)(a,b); // hopefully prints 343\nbazquux

Not tested but should give you an idea to adapt as needed.


More information about the Digitalmars-d-learn mailing list