Соответствует ли пустое расширение пакета значений пакету типов или необязательному параметру типа?

Я просто пытался взломать бинарный литерал оператор ""_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. Этот код действительно работает с небольшими изменениями; см. мой ответ ниже. Но это не решает вопрос напрямую. Хм, может быть, я должен был отредактировать это вместо ответа…

5
задан Xeo 5 October 2012 в 18:14
поделиться