Tôi có hàm mẫu trong đó loại enum được chuyển thành loại cơ bản của nó hoạt động tốt, nhưng tôi đã viết quá tải phải lấy số nguyên và tự trả về một lỗi mà int không phải là kiểu liệt kê. Trong mẫu của tôi, điều này cần phải được lọc ra. Chuyện gì thế?"Chuyển đổi" từ loại này sang loại tương tự gây ra lỗi
Dưới đây là các mẫu mã:
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<!std::is_enum<TT>::value, TT>::type
{
return t;
}
template <typename TT>
static constexpr auto get_value(TT t)
-> typename std::enable_if<std::is_enum<TT>::value, typename std::underlying_type<TT>::type>::type
{
return (typename std::underlying_type<TT>::type)t;
}
Tôi không biết nếu 'underlying_type' là SFINAE thân thiện, nhưng có một [workaround] (http://coliru.stacked-crooked.com/a/e7f1dd3b75c8d9c2) cho rằng –
gì? Tôi thấy nó hoạt động, nhưng những gì đang xảy ra ở đây mà làm cho nó hoạt động? Và tại sao sẽ không 'internal_type' bởi SFINAE thân thiện? – Adrian
Sự khởi tạo của 'std :: bases_type :: type' được hoãn lại, do đó' enable_if' có thể bị lỗi trước. Bởi * SFINAE thân thiện * Tôi có nghĩa là bất kỳ sự thay thế nào xảy ra chỉ trong bối cảnh ngay lập tức (nếu nó xảy ra bên trong 'inner_type' chính nó không phải là SFINAE thân thiện). –