Estaba tratando de piratear un literal binario operator ""_b
, pero me atasqué al tratar de terminar la recursión. ¿Cómo se define una función a la que se puede llamar usando una lista vacía de parámetros explícitos de la plantilla, que no entre en conflicto con una sobrecarga del paquete de parámetros? Luego, inspiración: unir la expansión del paquete vacío a algo loco.¿La expansión de un paquete de valores vacío coincide con un paquete de tipos o un parámetro de tipo opcional?
Pero GCC se queja de que los tipos inexistentes de la lista de argumentos vacíos no concuerdan con los tipos no requeridos explícitamente de la lista de parámetros. ¿Se supone que debe funcionar de esta manera?
template< char head, char ... tail >
constexpr unsigned long long parse_binary() {
return ((head - '0') << sizeof ... (tail))
+ parse_binary< tail ... >(); // Error: no overload for termination.
}
template< typename = void > // I want this to match an empty pack of chars.
// template< short = 0 > // even this would do.
constexpr unsigned long long parse_binary() {
return 0;
}
template< char ... digits >
constexpr unsigned long long operator ""_b() {
return parse_binary< digits ... >();
}
#include <iostream>
int main() {
std::cout << 010101_b << '\n';
}
Nota: La pregunta no está implementando operator ""_b
. Ese problema puede resolverse expandiendo el paquete a la lista de parámetros y pasando los tipos std::integral_constant
.
Nota 2: Este código realmente funciona con un ajuste menor; ver mi respuesta a continuación. Pero eso no aborda directamente la pregunta. Hmm, tal vez debería haber editado esto en lugar de responder ...
En general puede terminar la recursividad haciendo que la plantilla original 'plantilla
', y el uso 'template@ BjörnPollex No, luego pasar dos argumentos sería ambiguo. Los paquetes pueden estar vacíos. Una 'plantilla < char head >' y una 'plantilla harían el truco, pero sí, esa no es la pregunta. –
Potatoswatter