代码之家  ›  专栏  ›  技术社区  ›  Museful

如果模板参数是另一个模板的某个实例,则进行类型特征测试

  •  0
  • Museful  · 技术社区  · 6 年前

    T Bar<T> 成为一个 Foo<U> 对于任何 U .

    template<typename U>
    class Foo { };
    
    template<typename T, typename = std::enable_if_t< /*T is Foo<U> for any U*/>>
    class Bar {
        // ...
    };
    

    /*T is Foo<U> for any U*/ 用什么?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Barry    6 年前

    您可以编写一个通用特性来匹配任何专业:

    template <typename T, template <typename...> class Z>
    struct is_specialization_of : std::false_type { };
    
    template <typename... Args, template <typename....> class Z>
    struct is_specialization_of<Z<Args...>, Z> : std::true_type { };
    

    在您的具体案例中:

    is_specialization_of<T, Foo>::value // <== T is some kind of Foo
    
        2
  •  2
  •   Jarod42    6 年前

    你可以为此创建一个特性:

    template <typename T>
    struct is_foo : std::false_type {};
    
    template <typename T>
    struct is_foo<Foo<T>> : std::true_type {};