
From: christopher diggins <cdiggins@videotron.ca>
template < class constraints_policy,
^^^^^^^^^^^^^^^^^^ I think the usual naming convention would make that "Constraints" or something similar.
bool implicit_conversion_policy = true
^^^^^^^^^^^^^^^^^^^^^^^^^^ ditto: "ImplicitConversion"
> class constrained_value { private: struct unused_struct { };
Why the "_struct" suffix? Wouldn't "unused" suffice?
public: typedef constrained_value<constraints_policy, implicit_conversion_policy> self; typedef typename constraints_policy::value value; typedef typename mpl::if_c<implicit_conversion_policy, value, unused_struct>::type value_parameter;
typedef Constraints constraints_policy; typedef ImplicitConversion conversion_policy;
static constraints_policy get_constraints() { return constraints_policy(); } constrained_value() { } constrained_value(const self& x) { assign(x.get_value()); } constrained_value(value_parameter x) { assign(x); }
What if the type is not a built-in? That is, what if copying is expensive? Use TypeTraits to determine whether to pass by value or by reference.
const value get_value() const { return m; } operator value() { return m; }
Why return by value? Why not const reference? Even better, use TypeTraits to determine whether to return by value or by reference.
self& operator=(const self& x) { assign(x.get_value()); return *this; } self& operator=(value_parameter x) { assign(x); return *this; }
Use TypeTraits here, too.
void assign(unused_struct x) { } void assign(value_parameter x) { constraints_policy::assign(x, m); }
And here. Also, it you've shown the arguments in the reverse order from what I'd expect. The assignment operator puts the destination on the left, so I'd expect m on the left.
private: value m; };
-- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;