Tôi chỉ đang cố gắng để hack một số nhị phân là operator ""_b
, nhưng bị kẹt cố gắng chấm dứt đệ quy. Làm thế nào để xác định một hàm có thể được gọi bằng cách sử dụng một danh sách tham số mẫu trống rỗng, không xung đột với quá tải gói tham số? Sau đó, cảm hứng: phù hợp với việc mở rộng gói sản phẩm nào đó để một cái gì đó wacky.Việc mở rộng gói giá trị trống có khớp với gói loại hoặc tham số loại tùy chọn không?
Nhưng GCC than phiền rằng các loại không tồn tại của danh sách đối số trống không đồng ý với các loại danh sách tham số không bắt buộc. Có phải nó phải hoạt động theo cách này?
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';
}
Lưu ý: Câu hỏi không được triển khai operator ""_b
. Vấn đề đó có thể được giải quyết bằng cách mở rộng gói vào danh sách tham số và chuyển các loại std::integral_constant
xung quanh.
Lưu ý 2: Mã này thực sự không hoạt động với điều chỉnh nhỏ; xem câu trả lời của tôi dưới đây. Nhưng điều đó không trực tiếp giải quyết câu hỏi. Hmm, có lẽ tôi nên chỉnh sửa thông tin này thay vì trả lời…
Nói chung bạn có thể chấm dứt đệ quy bằng cách làm cho mẫu gốc 'mẫu
', và sử dụng 'template@ BjörnPollex Không, sau đó vượt qua hai đối số sẽ không rõ ràng. Các gói được phép để trống. Một 'mẫu < char head >' và một 'mẫu' sẽ làm các trick, nhưng yeah, đó không phải là câu hỏi. –
Potatoswatter