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

阻止模板化类将其自身用作实例

  •  1
  • user877329  · 技术社区  · 2 年前

    假设我有一个类模板

    template<class T>
    class Foo{};
    

    是否可以防止T成为Foo的实例化。也就是说,这不应该编译:

    struct Bar{};
    
    Foo<Foo<Bar>> x;
    
    2 回复  |  直到 2 年前
        1
  •  2
  •   HolyBlackCat    2 年前

    另一种选择:

    #include <type_traits>
    
    template <typename T>
    struct ValidFooArg;
    
    template <typename T>
    requires ValidFooArg<T>::value
    class Foo
    {
    
    };
    
    template <typename T>
    struct ValidFooArg : std::true_type {};
    template <typename T>
    struct ValidFooArg<Foo<T>> : std::false_type {};
    
    int main()
    {
        Foo<int> x; // ok
        Foo<Foo<int>> y; // error
    }
    
        2
  •  2
  •   Jarod42    2 年前

    在这种情况下,您可能仍然提供部分专业化以产生错误:

    template <typename T>
    constexpr bool always_false = false;
    
    template<class T>
    class Foo<Foo<T>>
    {
        static_assert(always_false<T>);
    };