Thread overview
The possibility of a DLang dynamic transfer class type and a member type.
Nov 14, 2019
zoujiaqing
Nov 14, 2019
Paul Backus
Nov 15, 2019
zoujiaqing
Nov 15, 2019
Basile B.
November 14, 2019
Like main function's code:


```D
import std.stdio;

interface Base
{
    int count();
}

class A : Base
{
    int a = 1;
    int b = 4;

    int count()
    {
        return a;
    }
}

class B : Base
{
    int b = 2;
    int a = 3;

    int count()
    {
        return b;
    }
}

void test(Type classType, Type propertyType1, Type peropertyType2)
{
    // ...
}

void main()
{
    Type class1;
    Type class2;

    class1 = A;
    class2 = B;
    class3 = A;

    auto obj1 = new class1;
    auto obj2 = new class2;

    if (true)
    {
        Base obj = cast(Base) obj1;
        writeln(obj.count());

        Base obj = cast(Base) obj2;
        writeln(obj.count());
    }

    assert(checkClass(class1, class2));
    assert(checkClass(class1, class3));

    test(A, A.a, B.b);
}
```
November 14, 2019
On Thursday, 14 November 2019 at 08:47:15 UTC, zoujiaqing wrote:
> Like main function's code:
>
> [...]
>
> void main()
> {
>     Type class1;
>     Type class2;
>
>     class1 = A;
>     class2 = B;
>     class3 = A;
>
>     auto obj1 = new class1;
>     auto obj2 = new class2;
>
>     if (true)
>     {
>         Base obj = cast(Base) obj1;
>         writeln(obj.count());
>
>         Base obj = cast(Base) obj2;
>         writeln(obj.count());
>     }
>
>     assert(checkClass(class1, class2));
>     assert(checkClass(class1, class3));
>
>     test(A, A.a, B.b);
> }
> ```

You can do something pretty similar with TypeInfo:

void main()
{
    TypeInfo_Class class1;
    TypeInfo_Class class2;

    class1 = typeid(A);
    class2 = typeid(B);

    auto obj1 = class1.create;
    auto obj2 = class2.create;

    if (true)
    {
        {
        	Base obj = cast(Base) obj1;
        	writeln(obj.count()); // 1
        }
        {
        	Base obj = cast(Base) obj2;
        	writeln(obj.count()); // 2
        }
    }
}
November 15, 2019
On Thursday, 14 November 2019 at 21:03:28 UTC, Paul Backus wrote:
> On Thursday, 14 November 2019 at 08:47:15 UTC, zoujiaqing wrote:
>> Like main function's code:
>>
>> [...]
>>
>> void main()
>> {
>>     Type class1;
>>     Type class2;
>>
>>     class1 = A;
>>     class2 = B;
>>     class3 = A;
>>
>>     auto obj1 = new class1;
>>     auto obj2 = new class2;
>>
>>     if (true)
>>     {
>>         Base obj = cast(Base) obj1;
>>         writeln(obj.count());
>>
>>         Base obj = cast(Base) obj2;
>>         writeln(obj.count());
>>     }
>>
>>     assert(checkClass(class1, class2));
>>     assert(checkClass(class1, class3));
>>
>>     test(A, A.a, B.b);
>> }
>> ```
>
> You can do something pretty similar with TypeInfo:
>
> void main()
> {
>     TypeInfo_Class class1;
>     TypeInfo_Class class2;
>
>     class1 = typeid(A);
>     class2 = typeid(B);
>
>     auto obj1 = class1.create;
>     auto obj2 = class2.create;
>
>     if (true)
>     {
>         {
>         	Base obj = cast(Base) obj1;
>         	writeln(obj.count()); // 1
>         }
>         {
>         	Base obj = cast(Base) obj2;
>         	writeln(obj.count()); // 2
>         }
>     }
> }

I want get property type, like this:

auto testType1 = A.a;
auto testType2 = B.a;

if (testType1 is testType2)
{
    writeln("yes");
}

November 15, 2019
On Friday, 15 November 2019 at 09:06:35 UTC, zoujiaqing wrote:
> On Thursday, 14 November 2019 at 21:03:28 UTC, Paul Backus wrote:
>> On Thursday, 14 November 2019 at 08:47:15 UTC, zoujiaqing wrote:
>>> [...]
>>
>> You can do something pretty similar with TypeInfo:
>>
>> void main()
>> {
>>     TypeInfo_Class class1;
>>     TypeInfo_Class class2;
>>
>>     class1 = typeid(A);
>>     class2 = typeid(B);
>>
>>     auto obj1 = class1.create;
>>     auto obj2 = class2.create;
>>
>>     if (true)
>>     {
>>         {
>>         	Base obj = cast(Base) obj1;
>>         	writeln(obj.count()); // 1
>>         }
>>         {
>>         	Base obj = cast(Base) obj2;
>>         	writeln(obj.count()); // 2
>>         }
>>     }
>> }
>
> I want get property type, like this:
>
> auto testType1 = A.a;
> auto testType2 = B.a;
>
> if (testType1 is testType2)
> {
>     writeln("yes");
> }

In D we rather do these kind of stuff statically, using template parameters and constraints, e.g as constraint if(__traits(hasMember)).