Я просто пытался взломать бинарный литерал оператор ""_b
, но застрял, пытаясь завершить рекурсию . Как определить функцию, которую можно вызвать, используя пустой явный список параметров шаблона, который не конфликтует с перегрузкой пакета параметров? Затем вдохновение: сравните пустую упаковку с чем-нибудь дурацким.
Но GCC жалуется, что несуществующие типы пустого списка аргументов не согласуются с неявно обязательными типами списка параметров. Это должно работать таким образом?
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';
}
Примечание. Вопрос не в реализации оператора ""_b
. Эту проблему можно решить, развернув пакет в список параметров и передав типы std::integral_constant
.
Примечание 2. Этот код действительно работает с небольшими изменениями; см. мой ответ ниже. Но это не решает вопрос напрямую. Хм, может быть, я должен был отредактировать это вместо ответа…