Implement Mariette's review comments.

This commit is contained in:
Sylvain Pion 2009-10-21 16:26:00 +00:00
parent 89ddee6c69
commit b77b27a8ad
2 changed files with 27 additions and 20 deletions

View File

@ -1,8 +1,8 @@
\begin{ccRefClass}{Default}
\ccDefinition
\ccRefName\ is a tag class. It can be used to explicitly state that one wants
to use the default value of a template parameter of a class template.
\ccRefName\ 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 \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
cycle in a nice way).
In order for this mechanism to work, the template class needs to do some
special treatment, and its documentation should state whether or not this
possibility is supported.
Using the mechanism is easy~: just plug \ccRefName\ 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 template class will not be the same when
instantiating it using \ccRefName\ instead of the real default type, even
though their interface will otherwise be the same. This may have consequences
in some rare cases.
Also beware that the type of the instantiated template class will not be the
same when instantiating it using \ccRefName\ instead of the type of the default
argument, even though their interfaces will otherwise be the same. This may
have consequences in some cases.
\ccIsModel
\ccc{DefaultConstructible, CopyConstructible}
\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
In order to help the template class writer, \ccRefName\ provides a
convenient way to extract the desired value for an argument which may be
defaulted using \ccRefName.
\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.}
\ccNestedType{template <typename Parameter, typename Type> struct Get;}
{A nested template providing a typedef \ccc{type} which equals \ccc{Type} if
\ccc{Parameter} is \ccRefName, and \ccc{Parameter} otherwise.}
\end{ccAdvanced}

View File

@ -1,14 +1,19 @@
#include <CGAL/Default.h>
// A will be used as the concrete default type
// A is a concrete type
struct A {};
// B is the template class which has 2 template arguments with defaults
template < typename A1_ = A, // we could also write "= CGAL::Default" here instead
typename A2 = int >
// 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
{
// 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;
};