
Niels Dekker - mail address until 2008-12-31 wrote:
Edward Diener wrote:
I solved it in my template by having the data value for T be of type T when T is top-level const, otherwise it is boost::value_initialized<T> when T is not a top-level const. The mpl::if_ metafunction and boost::is_const were used to generate the correct type, ala
mpl::if_<boost::is_const<T>,T,boost::value_initialized<T> >::type data;
Okay, so your data is either a T, or a value_initialized<T>. I was wondering, do you use the fact that value_initialized<T> implicitly converts to reference-to-T?
If your data is value_initialized<T>, you do boost::get(data) = arg. Would it be helpful to you to have an extra (explicit) boost::value_initialized<T> constructor, having const-reference to T as argument?
I have moved away from solving my problem based on const. This is because in C++ there is the notion of 'read-only' ( const ) and 'read-write' ( no const ) whereas what I am designing also needs the notion of 'write-only'. Therefore I have a second template parameter, defaulting to 'read-write' to control that and I can specialize on that parameter. I may revisit the const issue in my design again, but for now I am giving a compile time error when my T has top level const.