Thanks for all the above suggestions, but after many hour of re-reading Ali's book on template, structs, and mixins, I still in the woods. I've tried two approaches:

================ Templatetized struct ================================

struct Chameleon(T, Purpose p)
{
    static if (p == Purpose.POSITIONAL)
    {
        struct Positional { T  x, y, z; }
    }
    else static if (p == Purpose.COLOR)
    {
        struct Color_No_Alpha { T  r, g, b; }
    }
};

struct VertexData
{
    Chameleon!(float, purpose.POSITIONAL)  position;
    Chameleon!(float, purpose.COLOR)  color;
}

alias Vert = VertexData;
alias Pos = VertexData.position;
alias RGB = VertexData.color;

VertexData[] vertices =
[
VertexData( Pos(1.0, 1.0, 1.0), RGB(0.0, 0.0, 0.0)) // Compiler error
];

Error: struct Chameleon does not overload ()

Is this the overloading of the default constructor? Can't I use it? I'm I calling it incorrectly?

        
====================== The Mixin Template approach ===========================

mixin template Chameleon(T, Purpose p)
{
    static if (p == Purpose.POSITIONAL)
    {
        struct Positional { T  x, y, z; }
    }
    else static if (p == Purpose.COLOR)
    {
        struct Color_No_Alpha { T  r, g, b; }
    }
};

struct VertexData
{
    mixin Chameleon!(float, purpose.POSITIONAL)  position;
    mixin Chameleon!(float, purpose.COLOR)  color;
}

alias Vert = VertexData;
alias Pos = VertexData.position;
alias RGB = VertexData.color;

VertexData[] vertices =
[
    VertexData( Pos(1.0, 1.0, 1.0), RGB(0.0, 0.0, 0.0))
];

returns Error: function expected before (), not mixin Chameleon!(float, cast(Purpose)0) position;

And like above, I'm clueless.


Reply via email to