\( \newcommand{\E}{\mathrm{E}} \) \( \newcommand{\A}{\mathrm{A}} \) \( \newcommand{\R}{\mathrm{R}} \) \( \newcommand{\N}{\mathrm{N}} \) \( \newcommand{\Q}{\mathrm{Q}} \) \( \newcommand{\Z}{\mathrm{Z}} \) \( \def\ccSum #1#2#3{ \sum_{#1}^{#2}{#3} } \def\ccProd #1#2#3{ \sum_{#1}^{#2}{#3} }\)
CGAL 4.4 - STL Extensions for CGAL
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
CGAL::Default Class Reference

#include <CGAL/Default.h>

Definition

Default is a tag class.

It can be used to state that one wants to use the default argument of a template parameter of a class template.

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.

Is Model Of:

DefaultConstructible

CopyConstructible

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.

Example


File STL_Extension/Default.cpp

#include <CGAL/Default.h>
#include <CGAL/use.h>
// A is a concrete type
struct A {};
void use_a(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;
use_a(b.a1); // It is really of type A.
}

Classes

struct  Get
 A nested template providing a typedef type which equals Type if Parameter is Default, and Parameter otherwise. More...