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