Как переписать этот код без использования boost?

Моя задача - изменить код алгоритма Серджиу Потенко Well Equidistributed Long-period Linear (WELL), чтобы он не использовал boost (не говоря, что boost - это плохо, но из-за политики какой-то компании я должен удалить его) ,

Теперь, Серджиу ХОРОШО использует библиотеку mpl boost, в этом есть некоторая логика. Итак, один из способов - это прочитать все, и тогда, естественно, я смогу закончить задачу. Другой способ заключается в замене понемногу лучшим предположением.

Я на втором пути, чтобы надеяться, что этот метод проб и ошибок будет быстрее. До сих пор я успешно заменил boost::mpl::if_ и if_c на std::conditional, но при попытке обновить IsPowerOfTwo и Power2Modulo и т. Д. Произошла ошибка, поэтому я ищу там помощь.

Ниже приведен код, как переписать его без повышения, но только с ++ 17?

/**
    * Conditional expression of type (r & (r - 1)) == 0 which allows to check
    * whether a number @f$r@f$ is of type @f$2^n@f$.
    */
    typedef boost::mpl::equal_to<
        boost::mpl::bitand_<
        boost::mpl::_,
        boost::mpl::minus
        >
        >,
        boost::mpl::int_<0>
    > IsPowerOfTwo;

    template
    struct Power2Modulo
    {
        typedef typename boost::mpl::apply<
            IsPowerOfTwo,
            boost::mpl::integral_c
        >::type type;

        BOOST_STATIC_ASSERT(type::value);

        template
        static T calc(T value)
        {
            return value & (r - 1);
        }
    };

Если возможно, приведите краткий пример того, как его вызвать? Я пытался создать экземпляр IsPowerOfTwo или Power2Modulo в основном с

Detail::IsPowerOfTwo p0;     

или

Detail::Power2Modulo p1;

, но получил ошибку компиляции.

Я задал соответствующий вопрос раньше и получил предложение . Однако, не знакомый с метапрограммированием и повышением, я не совсем понимаю.

8
задан KARTHIKEYAN.A 3 January 2018 в 06:41
поделиться