Joseph Rushton Wakeling:
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"))
Perhaps can shorten that code writing a hasMembers helper (and I suggest to keep those names sorted):
static if (hasMembers!(G, "addEdge degreeIn ... vertexCount".split) { Bye, bearophile