// (by Ariel Badichi) #include <vector> #include <algorithm> #include <cassert>
#include <boost/assign.hpp> #include <boost/type_traits/is_const.hpp> #include <boost/mpl/eval_if.hpp> #include <boost/mpl/identity.hpp>
namespace mpl = boost::mpl;
template<typename C> struct iterator_type : mpl::eval_if< boost::is_const<C>, mpl::identity<typename C::const_iterator>, mpl::identity<typename C::iterator> > {};
template<typename C, typename V> typename iterator_type<C>::type find(C & c, const V & v) { return std::find(c.begin(), c.end(), v); }
int main() { using namespace boost::assign;
std::vector<int> v1; v1 += 1, 2, 30, 40, 500;
assert(find(v1, 40) != v1.end()); assert(find(v1, 41) == v1.end());
const std::vector<int> v2(v1);
assert(find(v2, 40) != v2.end()); assert(find(v2, 41) == v2.end());
return 0; }
Do you gain anything by using mpl::eval_if here, instead of just plain mpl::if_? In the following:
template <typename Container> struct get_iterator_type : mpl::if_< boost::is_const<Container>, typename Container::const_iterator, typename Container::iterator> {};
neither the true nor false branch of the if_ statement are metafunctions, so using eval_if doesn't seem to defer any metaffunction calls.
-mahall
I used mpl::eval_if because it was/is the 'default' condition testing metafunction for me. I agree that mpl::if_ is more appropriate for this case. - Ariel