[Home]CPPTM Answers - Exercise 4-5

BOOST WIKI | RecentChanges | Preferences | Page List | Links List

 // (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<
                            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_<
   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.


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

BOOST WIKI | RecentChanges | Preferences | Page List | Links List
Edit text of this page | View other revisions
Last edited April 10, 2005 3:26 pm (diff)
Disclaimer: This site not officially maintained by Boost Developers