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} \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}

View File

@ -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;
}; };