Template Metaprogramming Techniques for Concept-Based Specialization

Template Metaprogramming Techniques for Concept-Based Specialization

Scientific Programming 21 (2013) 43–61 43 DOI 10.3233/SPR-130362 IOS Press Template metaprogramming techniques for concept-based specialization Bruno Bachelet a,b,∗, Antoine Mahul c and Loïc Yon a,b a Clermont Université, Université Blaise Pascal, LIMOS, BP 10448, F-63000 Clermont-Ferrand, France b CNRS, UMR 6158, LIMOS, F-63171 Aubière, France c Clermont Université, Université Blaise Pascal, CRRI, F-63000 Clermont-Ferrand, France Abstract. In generic programming, software components are parameterized on types. When available, a static specialization mechanism allows selecting, for a given set of parameters, a more suitable version of a generic component than its primary version. The normal C++ template specialization mechanism is based on the type pattern of the parameters, which is not always the best way to guide the specialization process: type patterns are missing some information on types that could be relevant to define specializations. The notion of a concept, which represents a set of requirements (including syntactic and semantic aspects) for a type, is known to be an interesting approach to control template specialization. For many reasons, concepts were dropped from C++11 standard, this article therefore describes template metaprogramming techniques for declaring concepts, modeling relationships (meaning that a type fulfills the requirements of a concept), and refinement relationships (meaning that a concept refines the requirements of another concept). From a taxonomy of concepts and template specializations based on concepts, an automatic mechanism selects the most appropriate version of a generic component for a given instantiation. Our purely library-based solution is also open for retroactive extension: new concepts, relationships, and template specializations can be defined at any time; such additions will then be picked up by the specialization mechanism. Keywords: Generic programming, template specialization, concept-based overloading/specialization, template metaprogramming 1. Introduction ponents together at compile-time in an optimal man- ner, for instance, selecting the most appropriate code Generic programming focuses on providing param- for an algorithm based on the types bound to its tem- eterized software components, notably algorithms and plate parameters. data structures, as general as possible and broadly The normal C++ template specialization mechanism adaptable and interoperable [14], and as efficient as is based on the type pattern of the template parameters, non-parameterized components. Generic programming which is known to have many drawbacks. In this arti- relies on the notion of a generic component that is a cle, we propose a solution based on metaprogramming class, a function, or a method with parameters that are techniques to control template specialization with con- types or static values, instead of dynamic values as the cepts. It enables declaring a taxonomy of concepts that usual arguments of functions and methods. can be used to control template specialization: tem- With modern compilers, no loss of efficiency oc- plate parameters are constrained by concepts (instead curs when the parameters of a generic component of type patterns) to define a specialization. At instantia- are bound at compile time, which makes generic pro- tion time, an automatic mechanism selects the most ap- gramming particularly adapted for scientific program- propriate version of a generic component based on the ming (e.g., [4,5,15,17,21]). When designing scientific concepts of the types bound to the template parameters. libraries with generic programming, template special- ization is a major concern as it allows assembling com- 1.1. Template specialization *Corresponding author. Tel.: +33473405044; bruno.bachelet@ Similar to inheritance in object-oriented program- univ-bpclermont.fr. ming, which allows the specialization of classes, C++ 1058-9244/13/$27.50 © 2013 – IOS Press and the authors. All rights reserved 44 B. Bachelet et al. / Template metaprogramming techniques for concept-based specialization provides a mechanism to specialize generic compo- concept. The notion of a specialization between con- nents (called templates). At instantiation time, the cepts is called “refinement”: a concept that includes the compiler selects a version, the primary or a special- requirements of another concept is said to refine this ized one, of a template based on the type pattern of the concept. types (or static values) bound to the parameters. Here is For instance, let us define the concept Integral a C++ example of a generic class, ArrayCompara- that captures the requirements of an integral number, tor, that allows comparing two arrays that contain N and the concept Numerical that captures the require- elements of type T. ments of any kind of number. One can state that type int models concept Integral, and concept Inte- template <class T, int N> gral refines concept Numerical. class ArrayComparator { public: static int 1.3. Challenges with concepts run(const T * a, const T * b) { int i = 0; Concern (i) of the previous section is called “con- while (i<N && a[i]==b[i]) ++i; cept checking” [18], and its goal is to detect the types return bound to the parameters of a generic component that (i==N ? 0 : (a[i]<b[i] ? -1 : 1)); do not model the required concepts. A concept acts like } }; a contract between the users and the author of a generic component: the author specifies requirements on the The comparison of arrays of characters is presum- parameters using concepts, and the users must bind the ably more efficient using a built-in function. Therefore, parameters to types that fulfill these requirements (i.e., a specialization of the template with T = char can be to types that model the specified concepts). provided. In C++, concepts can not be defined explicitly, and for now, they are only documentation (e.g., Standard template <int N> Template Library). This leads to late error detections, class ArrayComparator<char,N> { public: and thus to cryptic error messages [18]: for instance, static int let us declare the instantiation ArrayCompara- run(const char * a, const char * b) tor<X,10>; if type X has no operator <, the error will { return memcmp(a,b,N); } be detected in method run, and not at the instantiation }; point. In some languages, specific features are used to support concepts for generic programming (e.g., type 1.2. Concepts classesinHaskell,deferredclassesinEiffel...[8]). In Java and C#, concepts are represented with in- In generic programming, instantiating a generic terfaces, but this approach restricts concepts to syntac- component raises two concerns: (i) how to ensure that tic requirements. Moreover, concepts bring more flex- a type bound to a parameter fulfills the requirements of ibility, because a type is not predestined to model any the generic component (e.g., any type bound to T must given concept. A type models a concept either implic- provide operators < and == in the ArrayCompara- itly (it fulfills automatically all the requirements of a tor class); (ii) how to select the most appropriate spe- concept, cf. “auto concepts” [9]), or explicitly (one has cialization of the generic component for a given bind- to declare the modeling relationship and to make ex- ing of the parameters (e.g., if type char is bound plicit how the type fulfills the requirements, cf. “con- to parameter T, then specialization ArrayCompara- cept maps” [9]). tor<char,N> is selected; but how to make another Concern (ii) of the previous section usually deals type benefit from the same specialization). with “concept-based overloading” [11], as generic pro- To address these issues, the notion of a concept has gramming in C++ has a central notion of generic al- been introduced [3]. When a type is bound to a param- gorithms where function template specialization is es- eter of a generic component, it must satisfy a set of sential. In this article, we propose a solution for the requirements represented by a concept. These require- specialization of both function and class templates, so ments define syntactic constraints (i.e., on the interface we choose to use the term “concept-based specializa- of the type) and semantic constraints (i.e., on the be- tion”. This approach uses the partial specialization ca- havior of the type). When a type fulfills the require- pability of templates that is only available for classes ments of a concept, it is said that the type “models” the in C++. Therefore, this solution is basically designed B. Bachelet et al. / Template metaprogramming techniques for concept-based specialization 45 for class template specialization, but is fully usable for be considered to be full concepts, as some features are function template specialization (as explained in Sec- missing. The long-term goal of this extension is to pro- tion 3.2, the specialization process of a function tem- pose a complete definition of concepts. plate can be easily delegated to a class template). A library-based emulation of C++0x concepts, The goal of concept-based specialization is to con- called the Origin Concept library, has also been devel- trol the specialization of generic components with oped based on new features of C++11 [19]. The pri- concepts rather than type patterns. By type pattern, mary goal of this solution is to provide a uniform inter- we mean a type or a parameterized type (e.g., T* face to defining and using concepts, but no new tech- or vector<T>), or a template template parameter nique is proposed for concept-based specialization as [23] (e.g.,

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    20 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us