Introduction to traits (and __traits)

Joseph Rushton Wakeling joseph.wakeling at webdrake.net
Fri Aug 30 14:23:48 PDT 2013


On 30/08/13 23:06, Ali Çehreli wrote:
> How about allSatisfy:
>
>    http://dlang.org/phobos/std_typetuple.html#.allSatisfy

I'll have a look at that, thanks :-)

Here's what I came up with, for now.  It should probably be extended with 
further tests on the characteristics of the various member functions but it 
seems to be sufficient for now:

////////////////////////////////////////////////////////

template isGraph(G)
{
     static if (!__traits(hasMember, G, "directed") ||
                !__traits(hasMember, G, "edge") ||
                !__traits(hasMember, G, "edgeCount") ||
                !__traits(hasMember, G, "vertexCount") ||
                !__traits(hasMember, G, "isEdge") ||
                !__traits(hasMember, G, "edgeID") ||
                !__traits(hasMember, G, "addEdge") ||
                !__traits(hasMember, G, "degreeIn") ||
                !__traits(hasMember, G, "degreeOut") ||
                !__traits(hasMember, G, "incidentEdgesIn") ||
                !__traits(hasMember, G, "incidentEdgesOut") ||
                !__traits(hasMember, G, "neighboursIn") ||
                !__traits(hasMember, G, "neighboursOut"))
     {
         enum bool isGraph = false;
     }
     else static if (!isBoolean!(typeof(G.directed)))
     {
         enum bool isGraph = false;
     }
     else static if (G.directed && (__traits(hasMember, G, "degree") ||
                                    __traits(hasMember, G, "incidentEdges") ||
                                    __traits(hasMember, G, "neighbours")))
     {
         enum bool isGraph = false;
     }
     else static if (!G.directed && (!__traits(hasMember, G, "degree") ||
                                     !__traits(hasMember, G, "incidentEdges") ||
                                     !__traits(hasMember, G, "neighbours")))
     {
         enum bool isGraph = false;
     }
     else
     {
         enum bool isGraph = true;
     }
}

////////////////////////////////////////////////////////


More information about the Digitalmars-d-learn mailing list