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