Stavo solo cercando di modificare un letterale binario operator ""_b
, ma mi sono bloccato cercando di terminare la ricorsione. Come definire una funzione che può essere chiamata utilizzando un elenco di parametri del template esplicito vuoto, che non è in conflitto con un sovraccarico del pacchetto di parametri? Quindi, ispirazione: abbina l'espansione del pacchetto vuoto a qualcosa di stravagante.Un'espansione del value pack vuoto corrisponde a un pacchetto di tipo o un parametro di tipo facoltativo?
Ma GCC lamenta che i tipi inesistenti dell'elenco di argomenti vuoti non concordano con i tipi non richiesti esplicitamente dell'elenco di parametri. Dovrebbe funzionare in questo modo?
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 domanda non sta applicando operator ""_b
. Questo problema può essere risolto espandendo il pacchetto nell'elenco dei parametri e passando i tipi std::integral_constant
in giro.
Nota 2: questo codice funziona effettivamente con una regolazione minore; vedi la mia risposta qui sotto. Ma questo non affronta direttamente la domanda. Hmm, forse avrei dovuto modificare questo invece di rispondere ...
In generale si può terminare la ricorsione, rendendo il modello originale 'template
', e usa 'template@ BjörnPollex No, quindi passare due argomenti sarebbe ambiguo. I pacchetti possono essere vuoti. Un 'template < char head >' e un 'template' farebbero il trucco, ma sì, non è questa la domanda. –
Potatoswatter