• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.TypeErasure library
2 //
3 // Copyright 2011 Steven Watanabe
4 //
5 // Distributed under the Boost Software License Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 //
9 // $Id$
10 
11 #ifndef BOOST_TYPE_ERASURE_PLACEHOLDERS_HPP_INCLUDED
12 #define BOOST_TYPE_ERASURE_PLACEHOLDERS_HPP_INCLUDED
13 
14 namespace boost {
15 namespace type_erasure {
16 
17 /**
18  * Placeholders are used heavily throughout the library.
19  * Every placeholder must derive from @ref placeholder.
20  * The library provides a number of placeholders,
21  * out of the box, but you are welcome to define your own,
22  * if you want more descriptive names.  The placeholder
23  * @ref _self is special in that it is used as the default
24  * wherever possible.
25  *
26  * What exactly is a placeholder?  Placeholders act as
27  * a substitute for template parameters in concepts.
28  * The library automatically replaces all the placeholders
29  * used in a concept with the actual types involved when
30  * it stores an object in an @ref any.
31  *
32  * For example, in the following,
33  *
34  * @code
35  * any<copy_constructible<_a>, _a> x(1);
36  * @endcode
37  *
38  * The library sees that we're constructing an @ref any
39  * that uses the @ref _a placeholder with an @c int.
40  * Thus it binds @ref _a to int and instantiates
41  * @ref copy_constructible "copy_constructible<int>".
42  *
43  * When there are multiple placeholders involved, you
44  * will have to use @ref tuple, or pass the bindings
45  * explicitly, but the substitution still works the
46  * same way.
47  */
48 struct placeholder {
49     /// INTERNAL ONLY
50     typedef void _boost_type_erasure_is_placeholder;
51 };
52 
53 struct _a : placeholder {};
54 struct _b : placeholder {};
55 struct _c : placeholder {};
56 struct _d : placeholder {};
57 struct _e : placeholder {};
58 struct _f : placeholder {};
59 struct _g : placeholder {};
60 
61 /**
62  * \brief The default placeholder
63  *
64  * @ref _self is the default @ref placeholder used
65  * by @ref any.  It should be used as a default
66  * by most concepts, so using concepts with no
67  * explicit arguments will "just work" as much as
68  * possible.
69  */
70 struct _self : placeholder {};
71 
72 }
73 }
74 
75 #endif
76