Рекурсивная функция во время компиляции для вычисления следующей степени двух целого числа?

НаСайт Bit Twiddling Hacks следующий алгоритм предоставлен для округления целого числа до следующей степени двух:

unsigned int v; // compute the next highest power of 2 of 32-bit v
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;

Я хотел бы написать функцию метапрограммирования, которая будет вычислять ту же операцию:

рекурсивно (для выполнения во время компиляции)для любого типа целого числа (оно должно даже работать для возможных неуклюжих нестандартных целых чисел любого размера, таких как 15 бит, 65 бит ...)

и вот форма ожидаемой функции:

template 
constexpr Type function(const Type value)
{
     // Something here
}

Как это сделать ?

Пример: дляvalue = 42 должно вернуться64

Ответы на вопрос(3)

Ваш ответ на вопрос