This can be useful in several cases: (a) when one needs a non-default value for another template parameter coming next (since C++ only supports defaults at the end of lists), (b) when the default is actually a complex expression, e.g. refering to previous template parameters (in this case, it shortens compiler error messages and mangled symbol names), (c) when defining the default involves circular dependencies of type instantiations (there, it breaks the cycle in a nice way).
Using the mechanism is easy : just plug Default as template argument in the place where you would like to use the default. You should refer to the documentation of the template class you are using in order to know whether this functionality is offered.
Also beware that the type of the instantiated template class will not be the same when instantiating it using Default instead of the type of the default argument, even though their interfaces will otherwise be the same. This may have consequences in some cases.
In order to help the template class writer, Default provides a convenient way to extract the desired type for a template parameter which may be defaulted using Default. It is enough to fetch the type as Default::Get<Parameter, Type>::type, as in the example program below.
| |
| |
A nested template providing a typedef type which equals Type if
Parameter is Default, and Parameter otherwise.
|
File: examples/STL_Extension/Default.cpp
#include <CGAL/Default.h> // A is a concrete type struct A {}; // B is the template class which has 2 template parameters // with default arguments : A and int. template < typename A1_ = A, typename A2 = int > struct B { B() : a1() {} // Note that it is also possible to use CGAL::Default // instead of A as the default argument for A1_ above. // Extract the desired type for A1 : typedef typename CGAL::Default::Get<A1_, A>::type A1; A1 a1; }; int main () { B<CGAL::Default, double> b; A a = b.a1; // It is really of type A. }