質問はタイトルの文章で説明するには難しすぎるかもしれませんが、これは最小限の例です:
#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;
}
基本的に、my_trait
2つの部分的な特殊化を持つ2つの型(および特殊化のためのダミー型)を取る基本テンプレートクラスがあります。
- 2つのタイプが同じ場合
- 2つのタイプが
temped
同じタイプのクラステンプレートのインスタンス化である場合
それがために推定されたタイプに複数の制限を入れ、「より専門」と感じるよう単純に、我々は、最初に曖昧にならない第2の部分特殊化を期待しているだろうT
し、U
ベーステンプレート上。それでも、主要なコンパイラーは、私たちが期待に反していたことに同意しているようです。
関連質問:stackoverflow.com/q/17412686/9171697
—
ケンビョウリン