Concept (generic programming)In generic programming, a concept is a description of supported operations on a type, including syntax and semantics. In this way, concepts are related to abstract types but concepts do not require a subtype relationship. Language useThe term was in use as early as 1998 for STL,[1] as this was one of the first libraries that extensively used templates. The term concept (and its popularization) is credited to Alexander Stepanov,[2][3] the primary designer of the STL. In the C++ 1998 standard, the Concept term was introduced to name just a simple description of the requirements for particular type, usually being a template parameter. It was not encoded in the language explicitly – the concept was expressed only by what operations are attempted on objects of that type and what is expected to work (that is, to compile correctly). There was a proposal to add concepts as an explicit language feature in C++11, though it was rejected as "not ready". C++20 eventually accepted the refined design of concept. Concepts are an example of structural typing. As generics in Java and C# have some similarities to C++'s templates, the role of concepts there is played by interfaces. However, there is one important difference between concepts and interfaces: when a template parameter is required to implement a particular interface, the matching type can only be a class that implements (explicitly) that interface. This is known as nominal typing. Concepts bring more flexibility because they can be satisfied in two ways:
But the C# language has several constructs where the used type does not need to explicitly implement a defined interface, it is only required to match the respective pattern (however, these patterns are not called concepts). E.g. the The Nim programming language implements concepts as a series of arbitrary compile-time boolean predicates.[6] Another language implementing something very similar to concepts is Haskell, where the feature is called type classes. ExamplesTotal orderingThe total ordering concept describes the semantics of the
Many algorithms rely on these properties to function properly.
For example the #include <concepts>
template <typename T>
requires std::totally_ordered<T>
T min(T a, T b) {
// < is defined.
if (b < a) {
return b;
} else {
// !(b < a) implies a == b or a < b
return a;
}
}
IteratorIf a type
See alsoReferences
External links |