Concepts provide us a common interface for structs, classes, interfaces, even arrays. Concepts can be practically extended. Concepts can be used for template specialization and as compile time constraints and as a static interface. Also we can use concepts as traits like that: static if (is(T : Concept)) { } instead of static if (satisfiesConcept!T) { }