
Robert Kawulak <tigrisek <at> interia.pl> writes:
bounded_int<int, 0, 23>::type hour; hour = 20; // OK hour = 26; // error -- throws an exception
I think the design of the interface is an example of taking generic programming too far. Making the constraints/predicates template parameters would have the limitations that only state-less functors and compile-time constraints could be accepted. This can be unacceptable, if, for instance, my predicate is a state-ful functor, or if it's a binded function (e.g. boost::bind(f, _1, x) ). So why not generalize the interface using boost::function, like this: template<typename T> class constraint_data { public: typedef boost::function<bool(T const&)> constraint_t; ... void add_constraint(constraint_t constraint); private: ... std::vector<constraint_t> v; }; We can have add_constraints and var-arg constructors when C++09 is out: constraint_data(std::initializer_list<constraint_t> list){ ... }