From a511007d0f160a540f8e6e70596eb458889b9491 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Wed, 16 Jan 2008 09:37:25 +0000 Subject: [PATCH] Added test and documentation for convenience class initialized_value, that was added with changeset [42815] [SVN r42816] --- value_init.htm | 52 +++++++++++++++++++++++++++++++++++++++++++-- value_init_test.cpp | 8 +++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/value_init.htm b/value_init.htm index 405f0b6..c97a0eb 100644 --- a/value_init.htm +++ b/value_init.htm @@ -32,7 +32,8 @@ Acknowledgements
@@ -52,6 +53,9 @@ union and class types. Moreover, value_initialized offers a workaround to various compiler issues regarding value-initialization. +Furthermore a convenience class, initialized_value is provided, +to avoid repeating the type name when retrieving the value from a +value_initialized<T> object.

@@ -117,6 +121,16 @@ constructed by the following declaration:
   value_initialized<T> var;
 
+

+

+The convenience class initialized_value +allows value-initializing a variable as follows: +

+  T var = initialized_value();
+
+This form of initialization is also very similar to T4 var4 = T4(), +but robust against the aforementioned compiler issues. +

Details

@@ -297,6 +311,40 @@ wrapped object from within a constant wrapper can be avoided if access to the wrapped object is always performed with the get() idiom:

value_initialized<int> x ;
get(x) = 1 ; // OK

value_initialized<int const> cx ;
get(x) = 1 ; // ERROR: Cannot modify a const object

value_initialized<int> const x_c ;
get(x_c) = 1 ; // ERROR: Cannot modify a const object

value_initialized<int const> const cx_c ;
get(cx_c) = 1 ; // ERROR: Cannot modify a const object
+ +

class initialized_value

+ +
+namespace boost {
+class initialized_value
+{
+  public :
+    template <class T> operator T() const ;
+};
+} // namespace boost
+
+ +The class initialized_value provides a convenient way to get +an initialized value: its conversion operator provides an appropriate +value-initialized object for any CopyConstructible type. + +Suppose you need to have an initialized variable of type T. +You could do it as follows: +
+  T var = T();
+
+But as mentioned before, this form suffers from various compiler issues. +The template value_initialized offers a workaround: +
+  T var = get( value_initialized<T>() );
+
+Unfortunately both forms repeat the type name, which +is rather short now (T), but could of course be +more like Namespace::Template<Arg>::Type. +Instead, one could use initialized_value as follows: +
+  T var = initialized_value();
+

References

[1] Bjarne Stroustrup, Gabriel Dos Reis, and J. Stephen Adamczyk wrote @@ -326,7 +374,7 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler


-

Revised 15 January 2008

+

Revised 16 January 2008

© Copyright Fernando Cacciola, 2002, 2008.

diff --git a/value_init_test.cpp b/value_init_test.cpp index 7b332d7..70cd998 100644 --- a/value_init_test.cpp +++ b/value_init_test.cpp @@ -7,7 +7,7 @@ // Test program for "boost/utility/value_init.hpp" // // 21 Agu 2002 (Created) Fernando Cacciola -// 15 Jan 2008 (Added tests regarding compiler issues) Fernando Cacciola, Niels Dekker +// 16 Jan 2008 (Added tests regarding compiler issues and initialized_value) Fernando Cacciola, Niels Dekker #include // For memcmp. #include @@ -52,7 +52,7 @@ struct NonPODBase struct NonPOD : NonPODBase { NonPOD () : id() {} - NonPOD ( std::string const& id_) : id(id_) {} + explicit NonPOD ( std::string const& id_) : id(id_) {} friend std::ostream& operator << ( std::ostream& os, NonPOD const& npod ) { return os << '(' << npod.id << ')' ; } @@ -192,6 +192,10 @@ bool test ( T const& y, T const& z ) boost::value_initialized x ; BOOST_CHECK ( y == x ) ; BOOST_CHECK ( y == boost::get(x) ) ; + + T initializedValue = boost::initialized_value() ; + BOOST_CHECK ( y == initializedValue ) ; + static_cast(x) = z ; boost::get(x) = z ; BOOST_CHECK ( x == z ) ;