3 \page named-param Named Parameters
5 \section named-func-param Named "Function" Parameters
7 C++ makes it possible to use default parameter values when calling a
8 function. In such a case we do not have to give value for parameters,
9 the program will use the default ones. Unfortunately sometimes this
10 is not enough. If we do not want to give values for all the
11 parameters, only for some of them we come across problems, because an
12 arbitrary set of parameters cannot be omitted. On the other hand
13 parameters have a fixed order in the head of the function. C++ can
14 apply the default values only in the back of the order, if we do not
15 give other value for them. So we can not give the function for
16 example the value of the first, and the third parameter, expecting
17 that the program will aplly the default value for the second
18 parameter. However sometimes we would like to use some functinos
19 exactly in this way. With a crafty trick and with some little
20 inconvenience this is possible. We have implemented this little trick
31 named_fn() : _id(0), _val(1), _dim(2) {}
32 named_fn& id(int p) { _id = p ; return *this; }
33 named_fn& val(double p) { _val = p ; return *this; }
34 named_fn& dim(int p) { _dim = p ; return *this; }
37 printf("Here is the function itself.");
43 The usage is the following.
45 We have to define a class, let's call it named_fn. Let us assume that
46 we would like to use a parameter, called X. In the named_fn class we
47 have to define an _X attribute, and an X function. The function
48 expects a parameter with the type of _X, and sets the value of
49 _X. After setting the value the function returns the class itself. The
50 class also have to have a function, called for example run(), we have
51 to implement here the original function itself. The constructor of the
52 class have to give all the attributes like _X the default values of
55 If we instantiate this class, the default values will be set for the
56 attributes (originally the parameters), initially. If we call the X
57 function, we get a class with the modified parameter value of
58 X. Therefore we can modify any parameter-value, independent from the
59 order. To run the algorithm we have to call the run() function at the
62 Example: named_fn().id(3).val(2).run();
64 \section traits-classes Traits Classes
66 The procedure above can also be applied when defining classes. In this
67 case the type of the attributes can be changed. Initially we have to
68 define a class with the default attribute types. This is the so called
69 Traits Class. Later on the types of these attributes can be changed,
70 as described below. In our software \ref lemon::DijkstraDefaultTraits is an
71 example of how a traits class looks like.
73 \section named-templ-param Named Class Template Parameters
75 If we would like to change the type of an attribute in a class that
76 was instantiated by using a traits class as a template parameter, and
77 the class contains named parameters, we do not have to reinstantiate
78 the class with new traits class. Instead of that, adaptor classes can
79 be used like in the following cases.
82 Dijkstra<>::SetPredNodeMap<NullMap<Node,Node> >
85 It can also be used in conjunction with other named template
86 parameters in arbitrary order.
89 Dijkstra<>::SetDistMap<MyMap>::SetPredMap<NullMap<Node,Edge> >
92 The result will be an instantiated Dijkstra class, in which the
93 DistMap and the PredMap is modified.
95 \section named-templ-func-param Named "Function" Template Parameters
97 If the class has so called wizard functions, the new class with the
98 modified tpye of attributes can be returned by the appropriate wizard
99 function. The usage of these wizard functions is the following: