Tôi cố gắng để thực hiện một SFINAE sử dụng bool
(không giống như phổ biến void_
trick):SFINAE thử với bool cho lỗi biên dịch: "mẫu tranh luận 'T :: giá trị' liên quan đến mẫu tham số"
template<typename T, bool = true>
struct Resolve
{
static const bool value = false;
};
template<typename T>
struct Resolve<T, T::my_value>
{
static const bool value = true;
};
Mục đích là để chuyên, các lớp học có static const bool my_value = true;
được định nghĩa bên trong nó. Nếu chúng được xác định false
hoặc không được xác định thì không chuyên nó. ví dụ:
struct B1 { // specialize Resolve for this case
static const bool my_value = true;
};
struct B2 { // don't specialize
static const bool my_value = false;
};
struct B3 {}; // don't specialize
Khi áp dụng các thủ thuật ở trên B1
nó mang lại cho các lỗi biên dịch:
Resolve<B1>::value;
error: template argument ‘T::my_value’ involves template parameter(s)
Tôi biết rằng điều này có thể đạt được với cách thay thế. Tuy nhiên, tôi quan tâm đến việc biết, tại sao nó cung cấp cho trình biên dịch lỗi ở đây và nó có thể được giải quyết trong mã này chính nó?
Giải pháp tốt. Tôi đã chỉnh sửa một số phần và ví dụ. Đối với yêu cầu cụ thể của tôi, tôi muốn khám phá thủ thuật 'bool' thay vì mẹo' void_' cho SFINAE. Ngoài ra, nếu nó bị cấm theo tiêu chuẩn thì tôi nghĩ tôi nên chấp nhận câu trả lời này, bởi vì tôi không thấy cách nào khác. – iammilind
Vâng, chỉnh sửa cũng được. Tôi nghĩ rằng bạn có thể sử dụng các thành viên trong 'bool2type', đó là lý do tại sao tôi thêm nó. Nhưng nếu bạn không cần nó, thì nó hoàn toàn ổn với tôi. – Nawaz
Ahh, đây chính xác là giải pháp tôi cần cho vấn đề của mình. [Câu hỏi 15115109] (http://stackoverflow.com/questions/15115109/how-to-convert-templated-function-overloads-to-partial-specialized-templated-cla) Tôi đã tiến thêm một bước nữa bằng cách sử dụng std :: integral_constant, và những cái có sẵn trực tiếp thông qua thành viên type_traits '":: type". –