mirror of https://github.com/CGAL/cgal
Implement Mariette's review comments.
This commit is contained in:
parent
89ddee6c69
commit
b77b27a8ad
|
|
@ -1,8 +1,8 @@
|
||||||
\begin{ccRefClass}{Default}
|
\begin{ccRefClass}{Default}
|
||||||
|
|
||||||
\ccDefinition
|
\ccDefinition
|
||||||
\ccRefName\ is a tag class. It can be used to explicitly state that one wants
|
\ccRefName\ is a tag class. It can be used to state that one wants
|
||||||
to use the default value of a template parameter of a class template.
|
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
|
This can be useful in several cases: (a) when one needs a non-default value for
|
||||||
another template parameter coming next (since \CC\ only supports defaults at
|
another template parameter coming next (since \CC\ only supports defaults at
|
||||||
|
|
@ -12,29 +12,31 @@ error messages and mangled symbol names), (c) when defining the default
|
||||||
involves circular dependencies of type instantiations (there, it breaks the
|
involves circular dependencies of type instantiations (there, it breaks the
|
||||||
cycle in a nice way).
|
cycle in a nice way).
|
||||||
|
|
||||||
In order for this mechanism to work, the template class needs to do some
|
Using the mechanism is easy~: just plug \ccRefName\ as template argument
|
||||||
special treatment, and its documentation should state whether or not this
|
in the place where you would like to use the default. You should refer
|
||||||
possibility is supported.
|
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 template class will not be the same when
|
Also beware that the type of the instantiated template class will not be the
|
||||||
instantiating it using \ccRefName\ instead of the real default type, even
|
same when instantiating it using \ccRefName\ instead of the type of the default
|
||||||
though their interface will otherwise be the same. This may have consequences
|
argument, even though their interfaces will otherwise be the same. This may
|
||||||
in some rare cases.
|
have consequences in some cases.
|
||||||
|
|
||||||
\ccIsModel
|
\ccIsModel
|
||||||
\ccc{DefaultConstructible, CopyConstructible}
|
\ccc{DefaultConstructible, CopyConstructible}
|
||||||
|
|
||||||
\begin{ccAdvanced}
|
\begin{ccAdvanced}
|
||||||
|
|
||||||
|
In order to help the template class writer, \ccRefName\ provides a convenient
|
||||||
|
way to extract the desired type for a template parameter which may be defaulted
|
||||||
|
using \ccRefName. It is enough to fetch the type as
|
||||||
|
\ccc{Default::Get<Parameter, Type>::type}, as in the example program below.
|
||||||
|
|
||||||
\ccTypes
|
\ccTypes
|
||||||
|
|
||||||
In order to help the template class writer, \ccRefName\ provides a
|
\ccNestedType{template <typename Parameter, typename Type> struct Get;}
|
||||||
convenient way to extract the desired value for an argument which may be
|
{A nested template providing a typedef \ccc{type} which equals \ccc{Type} if
|
||||||
defaulted using \ccRefName.
|
\ccc{Parameter} is \ccRefName, and \ccc{Parameter} otherwise.}
|
||||||
|
|
||||||
\ccNestedType{template <typename Argument, typename Value> struct Get;}
|
|
||||||
{A nested template providing a typedef \ccc{type} which equals \ccc{Value} if
|
|
||||||
\ccc{Argument} is \ccRefName, and \ccc{Argument} otherwise.}
|
|
||||||
|
|
||||||
\end{ccAdvanced}
|
\end{ccAdvanced}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,19 @@
|
||||||
#include <CGAL/Default.h>
|
#include <CGAL/Default.h>
|
||||||
|
|
||||||
// A will be used as the concrete default type
|
// A is a concrete type
|
||||||
struct A {};
|
struct A {};
|
||||||
|
|
||||||
// B is the template class which has 2 template arguments with defaults
|
// B is the template class which has 2 template parameters
|
||||||
template < typename A1_ = A, // we could also write "= CGAL::Default" here instead
|
// with default arguments : A and int.
|
||||||
typename A2 = int >
|
template < typename A1_ = A, typename A2 = int >
|
||||||
struct B
|
struct B
|
||||||
{
|
{
|
||||||
|
// 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;
|
typedef typename CGAL::Default::Get<A1_, A>::type A1;
|
||||||
|
|
||||||
A1 a1;
|
A1 a1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue