Has no one mentioned void[0][T] yet? alias Set(T) = void[0][T];
void add(T)(ref void[0][T] set, T key) { set[key] = (void[0]).init; } bool contains(T)(inout(void[0][T]) set, T key) { return (key in set) !is null; } void main() { Set!int set; set.add(1); assert(set.contains(1)); set.remove(1); assert(!set.contains(1)); }