Mã mẫu 1:sự khác biệt giữa tên thông số mẫu so với tên tệp không?
namespace detail {
enum enabler { dummy };
}
class foo {
public:
template <typename T,
typename std::enable_if<!std::is_integral<T>::value,
detail::enabler>::type = detail::enabler::dummy>
void func(T t) {
std::cout << "other" << std::endl;
}
template <typename T,
typename std::enable_if<std::is_integral<T>::value,
detail::enabler>::type = detail::enabler::dummy>
void func(T t) {
std::cout << "integral" << std::endl;
}
};
Mã mẫu 2:
namespace detail {
enum enabler { dummy };
}
class foo {
public:
template <typename T,
typename T2 = typename std::enable_if<!std::is_integral<T>::value, detail::enabler>::type>
void func(T t) {
std::cout << "other" << std::endl;
}
template <typename T,
typename T2 = typename std::enable_if<std::is_integral<T>::value, detail::enabler>::type>
void func(T t) {
std::cout << "integral" << std::endl;
}
};
Tôi hiểu tại sao mẫu 2 không biên dịch. Về cơ bản vì cả hai hàm mẫu giống nhau (chúng thậm chí có cùng các tham số mẫu T
, T2
).
Tôi không hiểu tại sao mẫu 1 biên dịch lại! Tôi thấy rằng đó là cùng một vấn đề. Về cơ bản thay vì có tham số mẫu thứ hai là typename
, đây là một số enum
thay vì typename
lần này.
Ai đó có thể giải thích được không?
Hơn nữa, tôi đã thực thi đoạn mã sau đây và nó trả về sự thật thậm chí còn khó hiểu hơn! (Làm cho cảm giác rằng đó là sự thật nhưng khó hiểu rằng mẫu 1 biên dịch)
std::cout
<< std::boolalpha
<< std::is_same<std::enable_if<std::is_integral<int>::value, int>::type,
std::enable_if<!std::is_integral<float>::value, int>::type>::value
<< std::endl;
Điều này không thực sự liên quan đến yêu cầu đối với 'typename' rất nhiều vì đây là câu hỏi về cách SFINAE hoạt động. – Niall
Điều gì đáng ngạc nhiên về bit cuối cùng? Chúng tôi có 'enable_if :: type', hai lần. –
Barry