Thông thường khi tôi viết mẫu chuyên biệt, trước tiên tôi sử dụng khai báo chuyển tiếp và khai báo các trường hợp thuộc về chuyên môn. Trong trường hợp của bạn, tôi hiểu rằng bạn đang cố gắng để viết một mẫu variadic mà không có trường hợp rỗng (Đó là, một mẫu variadic mà có thể có ít nhất một loại).
Mã của bạn làm tôi ngạc nhiên bởi vì tôi nghĩ rằng bạn là chính xác, chuyên ngành đầy đủ về đặc tính của bạn phù hợp với các trường hợp lỗ ... Trước tiên tôi đã cố gắng sử dụng một khai báo chuyển tiếp của lớp đặc điểm của bạn, và xác định ONLY đầy đủ variadic chuyên môn hóa (Vì vậy, nếu tham số của đặc điểm không phải là một trường hợp Wrapper
không biên dịch). Và thats chính xác những gì đã Đã xảy, thất vọng tôi một lần nữa:
#include <iostream>
#include <utility>
template<typename F , typename... T>
struct Wrapper {};
template<typename T>
struct is_wrapper;
//template<typename T>
//struct is_wrapper : std::false_type {};
template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};
//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};
using my_wrapper_type = Wrapper<int,double>;
int main()
{
std::cout << std::boolalpha << is_wrapper<my_wrapper_type>::value << std::endl;
}//"Invalid use of incomplete type" ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Cuối cùng tôi thử với phương pháp kê khai về phía trước trong lớp Wrapper
. Và đáng ngạc nhiên, nó hoạt động:
#include <iostream>
#include <utility>
template<typename... T>
struct Wrapper;
template<typename F, typename... T>
struct Wrapper<F,T...>{ };
template<typename T>
struct is_wrapper : std::false_type {};
template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};
//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};
using my_wrapper_type = Wrapper<int,double>;
int main()
{
std::cout << std::boolalpha << is_wrapper<my_wrapper_type>::value << std::endl;
}
này in:
đúng
Here là mã chạy ở ideone.
Trân trọng, tôi không hiểu tại sao mã của bạn bị lỗi và hoạt động của tôi. Lỗi trình biên dịch của nó, hoặc có cái gì đó chúng ta đang thiếu? Tôi không biết.
Sự khác biệt là số tham số mẫu cho mẫu lớp 'Trình bao bọc '. Phiên bản (thứ hai) của bạn chỉ có một tham số mẫu, trong khi phiên bản của OP có hai tham số. Chuyên môn từng phần của bạn 'struct Wrapper' không thay đổi điều đó. –
dyp
@DyP OK, nhưng nếu bạn có mẫu có hai tham số (Một tham số mẫu bình thường và tham số mẫu variadic) và bạn chuyển gói variadic vào mẫu này, gói variadic không phải mở rộng khớp với tham số thông thường đầu tiên, và tham số thứ hai (tham số variadic)?Đây là những gì tôi không hiểu, tại sao các gói không được mở rộng theo cách đó. – Manu343726
Tôi vẫn đang cố gắng tìm ra đâu (và tại sao) tiêu chuẩn cấm chuyên môn hóa một phần để phù hợp với gói tham số trong trường hợp này. Đoán nó ở đâu đó xung quanh [temp.deduct.type]/9. (Pack mở rộng là khác nhau từ deducing.) – dyp