summaryrefslogtreecommitdiff
path: root/boost/type_erasure/placeholder.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/type_erasure/placeholder.hpp')
-rw-r--r--boost/type_erasure/placeholder.hpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/boost/type_erasure/placeholder.hpp b/boost/type_erasure/placeholder.hpp
new file mode 100644
index 0000000000..0ea7ab5bce
--- /dev/null
+++ b/boost/type_erasure/placeholder.hpp
@@ -0,0 +1,72 @@
+// Boost.TypeErasure library
+//
+// Copyright 2011 Steven Watanabe
+//
+// Distributed under the Boost Software License Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// $Id$
+
+#ifndef BOOST_TYPE_ERASURE_PLACEHOLDERS_HPP_INCLUDED
+#define BOOST_TYPE_ERASURE_PLACEHOLDERS_HPP_INCLUDED
+
+namespace boost {
+namespace type_erasure {
+
+/**
+ * Placeholders are used heavily throughout the library.
+ * Every placeholder must derive from @ref placeholder.
+ * The library provides a number of placeholders,
+ * out of the box, but you are welcome to define your own,
+ * if you want more descriptive names. The placeholder
+ * @ref _self is special in that it is used as the default
+ * wherever possible.
+ *
+ * What exactly is a placeholder? Placeholders act as
+ * a substitute for template parameters in concepts.
+ * The library automatically replaces all the placeholders
+ * used in a concept with the actual types involved when
+ * it stores an object in an @ref any.
+ *
+ * For example, in the following,
+ *
+ * @code
+ * any<copy_constructible<_a>, _a> x(1);
+ * @endcode
+ *
+ * The library sees that we're constructing an @ref any
+ * that uses the @ref _a placeholder with an @c int.
+ * Thus it binds @ref _a to int and instantiates
+ * @ref copy_constructible "copy_constructible<int>".
+ *
+ * When there are multiple placeholders involved, you
+ * will have to use @ref tuple, or pass the bindings
+ * explicitly, but the substitution still works the
+ * same way.
+ */
+struct placeholder {};
+
+struct _a : placeholder {};
+struct _b : placeholder {};
+struct _c : placeholder {};
+struct _d : placeholder {};
+struct _e : placeholder {};
+struct _f : placeholder {};
+struct _g : placeholder {};
+
+/**
+ * \brief The default placeholder
+ *
+ * @ref _self is the default @ref placeholder used
+ * by @ref any. It should be used as a default
+ * by most concepts, so using concepts with no
+ * explicit arguments will "just work" as much as
+ * possible.
+ */
+struct _self : placeholder {};
+
+}
+}
+
+#endif