Boost logo

Boost :

From: Bruno Lalande (bruno.lalande_at_[hidden])
Date: 2008-05-22 08:46:41


> I don't remember the following being suggested:

Yep it's a possibility. It's close to my last attempt, using the MPL:

template <int N>
struct even_positive_power
{
    template <typename T>
    static typename tools::promote_args<T>::type result(T base)
    {
        return positive_power<2>::result(
                  positive_power<N/2>::result(base));
    }
};

template <int N>
struct odd_positive_power
{
    template <typename T>
    static typename tools::promote_args<T>::type result(T base)
    {
        return base*positive_power<2>::result(
                  positive_power<N/2>::result(base));
    }
};

template <int N>
struct positive_power
{
    template <typename T>
    static typename tools::promote_args<T>::type result(T base)
    {
        return
        mpl::if_<
            mpl::greater_equal<mpl::int_<N%2>, mpl::int_<1> >,
            odd_positive_power<N>,
            even_positive_power<N>
>::type::result(base);
    }
};

BTW, I have a question about the MPL. I would have preferred to write
"equal<int_<N%2>, int_<0> >" followed by even_ then odd_ but it
doesn't work. I'm apparently missing something in the use of
mpl::equal. Could someone explain me why:

mpl::equal<mpl::int_<1>, mpl::int_<0> >::type::value

equals to 1??

Thanks
Bruno


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