Câu hỏi có thể quá khó để mô tả trong câu trong tiêu đề, nhưng đây là một ví dụ tối thiểu:
#include <iostream>
#include <type_traits>
template <class T, class U, class Enabler>
struct my_trait : std::false_type
{};
template <class T, class U>
struct my_trait<T, U,
std::enable_if_t<std::is_same<T, U>::value>> : std::true_type
{};
template <class T>
class temped
{};
template <class T>
struct my_trait<temped<T>, temped<T>, void> : std::false_type
{};
template <class T, class U>
using trait_t = my_trait<T, U, void>;
int main()
{
std::cout << std::boolalpha;
std::cout << trait_t<int, float>::value << std::endl; // false
std::cout << trait_t<int, int>::value << std::endl; // true
// Compilation error: Ambiguous
//std::cout << trait_t<temped<int>, temped<int>>::value << std::endl;
return 0;
}
Về cơ bản, chúng ta có một lớp mẫu cơ sở my_trait
lấy hai loại (và một loại giả cho mục đích chuyên môn hóa), với hai chuyên ngành một phần:
- Khi hai loại giống nhau
- Khi hai loại là khởi tạo
temped
mẫu lớp cho cùng một loại
Ngẫu nhiên, chúng tôi đã dự kiến chuyên môn hóa một phần thứ hai sẽ không mơ hồ với phần thứ nhất, vì nó cảm thấy "chuyên biệt hơn", đặt ra nhiều hạn chế hơn đối với các loại suy luận cho T
và U
trên mẫu cơ sở. Tuy nhiên, các trình biên dịch chính dường như đồng ý rằng chúng tôi đã sai với kỳ vọng của mình: tại sao nó không được coi là chuyên biệt hơn?