代码之家  ›  专栏  ›  技术社区  ›  463035818_is_not_an_ai

是否有可能区分主模板的实例化和(部分)专门化的实例化?

  •  2
  • 463035818_is_not_an_ai  · 技术社区  · 6 月前

    T U 是的实例化 T

    #include <type_traits>
    
    template <typename T> struct foo {};
    template <> struct foo<int> {};
    
    template <typename T> struct is_instantiation_of_foo : std::false_type {};
    template <typename T> struct is_instantiation_of_foo<foo<T>> : std::true_type {};
    
    int main() {
        static_assert(is_instantiation_of_foo<foo<int>>{});
        static_assert(!is_instantiation_of_foo<int>{});
    }
    

    假设,我只知道主模板,我无法引入静态成员以简单的方式将主模板与专用模板区分开来。有可能写出一个特征吗 F<T> std::true_type T 是主模板的实例化,以及 std::false_type T 是专业化的实例化吗?

    1 回复  |  直到 6 月前
        1
  •  1
  •   Davis Herring    6 月前

    :该语言根本无法引用(部分)专门化(除非通过隐式使用它,这在这里无关紧要,因为您对结果类型的任何(已知)属性都不感兴趣)。甚至没有(C++26) 反思 可以将部分专门化作为与主模板不同的模板进行访问。