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 use
The 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 tried to be performed 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".
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. Concepts bring more flexibility because they can be satisfied by two ways:
- explicitly defined as satisfied by using a concept map (defined separately to the type itself, unlike interfaces)
- implicitly defined for "auto concepts", which can be used also for built in types and other types that were not predestined for this use
Another language implementing something very similar to concepts is Haskell, where the feature is called type classes.
Example
For example, if a type I
satisfies the Trivial Iterator concept in C++, and i
is of type I
, the following are valid expressions with corresponding semantics:[4]
-
I i
default construction. -
*i
must be convertible to some typeT
. -
i->m
is valid if(*i).m
is.
See also
References
- ↑ Austern, M.H. Generic programming and the STL: using and extending the C++ Standard Template Library. 1998. pp 17–18
- ↑ a bit of background for concepts and C++17—Bjarne Stroustrup, by Bjarne Stroustrup | Feb 26, 2016
- ↑ Alex Stepanov, by Bjarne Stroustrup | Jan 21, 2016
- ↑ Trivial Iterator
External links
- Boost Generic Programming Techniques
- Douglas Gregor, et al. Concepts: Linguistic Support for Generic Programming in C++
- Doug Gregor talk on Concepts at Google (video)
- A comparison of C++ concepts and Haskell type classes