Моя задача - изменить код алгоритма Серджиу Потенко 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;
, но получил ошибку компиляции.
Я задал соответствующий вопрос раньше и получил предложение . Однако, не знакомый с метапрограммированием и повышением, я не совсем понимаю.