¿Función recursiva en tiempo de compilación para calcular la siguiente potencia de dos de un entero?

Sobre elSitio web de Bit Twiddling Hacks se proporciona el siguiente algoritmo para redondear un número entero a la siguiente potencia de dos:

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++;

Me gustaría codificar una función de metaprogramación que computará la misma operación:

recursivamente (para la ejecución en tiempo de compilación)para cualquier tipo de entero (incluso debería funcionar para posibles enteros extraños no estándar de cualquier tamaño, como 15 bits, 65 bits ...)

Y aquí está la forma de la función esperada:

template <typename Type,
          // Something here (like a recursion index)
          class = typename std::enable_if<std::is_integral<Type>::value>::type,
          class = typename std::enable_if<std::is_unsigned<Type>::value>::type>
constexpr Type function(const Type value)
{
     // Something here
}

Como hacer eso ?

Ejemplo: paravalue = 42 debería volver64

Respuestas a la pregunta(3)

Su respuesta a la pregunta