Giả sử tôi có một lớp học với các chữ ký sau:Làm cách nào để enable_if một lớp với đối số mẫu có định dạng variadic?
template <typename T, typename... Args>
class A;
Nhưng cách này cư xử lớp nên phụ thuộc vào một số tham số khác, hãy nói rằng đó là giá trị của T::value
:
template <typename T, typename... Args, typename Enable>
class A;
template <typename T, typename... Args, typename = typename std::enable_if<T::value>::type>
class A
{
// do something
};
template <typename T, typename... Args, typename = typename std::enable_if<!T::value>::type>
class A
{
// do something else
};
int main() { return 0; }
Tuy nhiên, chương trình này cung cấp lỗi sau:
prog.cpp:6:11: error: parameter pack ‘Args’ must be at the end of the template parameter list class A;
Tôi đã cố gắng tìm một nguồn thông tin tốt về việc sử dụng enable_if
để chọn các lớp có mẫu variadic. Câu hỏi duy nhất tôi có thể tìm được cái này:
How to use std::enable_if with variadic template
Nhưng bất chấp tên, câu hỏi này và câu trả lời của nó là không thể giúp ích nhiều. Nếu ai đó có thể cung cấp hoặc liên kết một hướng dẫn về cách thức này nên được tiếp cận và tại sao điều đó sẽ được đánh giá cao.
Tôi đã cố gắng khai báo 'A a;', nhưng trình biên dịch vẫn nói với tôi: "instantiation implicit của undefined template' chi tiết :: A_impl 'Tôi rất cảm kích nếu bạn có thể giải thích điều này một chút. (Xin lỗi tôi vẫn đang học những thứ này) –
astroboylrx
@astroboylrx Để làm việc này, đầu tiên gõ vào danh sách tham số mẫu của 'A' cần phải có một' giá trị' thành viên, bởi vì kiểm tra trong 'enable_if' phụ thuộc vào nó.Bạn đã sử dụng' float' thay vào đó.Không có 'giá trị' thành viên, các kiểm tra trong' enable_if' không hợp lệ, do đó, mẫu chính của 'A_impl' (nó không có triển khai thực hiện, nó chỉ được khai báo) được chọn và bạn nhận được lỗi. – jrok
Xin lỗi vì trả lời trễ của tôi. Cảm ơn bạn đã giải thích này. Tôi thấy nó bây giờ. :-) – astroboylrx