Boost logo

Boost :

From: Andy Little (andy_at_[hidden])
Date: 2006-07-25 06:42:04


"Andy Little" <andy_at_[hidden]> wrote in message
news:ea4hqs$lg0$1_at_sea.gmane.org...

Further the following code should work AFAICS, at least according to the
documentation

#include <boost/mpl/equal_to.hpp>
#include <boost/mpl/integral_c.hpp>
#include <boost/mpl/next.hpp>
#include <boost/mpl/prior.hpp>

#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/static_assert.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/integral_c.hpp>
#include <iostream>

// Write a type fulfilling the Integral Constant requirements
// http://www.boost.org/libs/mpl/doc/refmanual/integral-constant.html
template <int N>
struct my_int{
    typedef int value_type;
    static const int value = N;
    operator int ()const { return value;}
    typedef my_int type;
};

namespace boost{ namespace mpl{

    template <int N >
    struct next<my_int<N> > {
        typedef my_int<N+1> type;
    };
    template <int N >
    struct prior<my_int<N> > {
        typedef my_int<N-1> type;
    };
}}

/*
Check a type is a model of Integral Constant
http://www.boost.org/libs/mpl/doc/refmanual/integral-constant.html
*/
template <typename T>
void IntegralConstantConcept()
{
    typedef typename boost::mpl::next<T>::type next_type;
    typedef typename boost::mpl::prior<T>::type prior_type;
    typedef typename T::type type;
    typedef typename T::value_type value_type;
    typename T::value_type t = T::value;
    typename T::value_type t1 = T();
    static int const next_value = T::value +1;
    static int const prior_value = T::value -1;

    BOOST_MPL_ASSERT( (boost::is_same<type,T>) );
    BOOST_STATIC_ASSERT( (next_type::value == next_value));
    BOOST_STATIC_ASSERT( (prior_type::value == prior_value));
    std::cout << typeid (T).name() << "passed Integral Concept Concept
Check\n";

};

namespace mpl = boost::mpl;

int main()
{
    // Concept check
    IntegralConstantConcept<my_int<1> >();
     IntegralConstantConcept<mpl::integral_c<int,1> >();
    IntegralConstantConcept<mpl::int_<1> >();
    // fails
    // IntegralConstantConcept<mpl::bool_<true> >();
    // should fail
   // IntegralConstantConcept<int >();

// Should work !
// http://www.boost.org/libs/mpl/doc/refmanual/equal-to.html

    bool result = mpl::equal_to< my_int<1>,my_int<1> >::value ;
    std::cout << result << '\n';
}

regards
Andy Little


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk