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

静态断言引用封闭模板类

  •  2
  • Graznarak  · 技术社区  · 8 年前

    在以下代码中,VS2015投诉 IsInstantiation<OtherType, T1>::value ,给出此错误“模板参数“TT”的模板参数无效,应为类模板”。我该怎么解决这个问题?我想限制 OtherType SomeType 其他类型 .

    template <template<typename...> class TT, typename T>
    struct IsInstantiation : std::false_type
    {
    };
    
    template <template<typename...> class TT, typename... Ts>
    struct IsInstantiation<TT, TT<Ts...>> : std::true_type
    {
    };
    
    template <typename T1>
    class SomeType{};
    
    template <typename T1, typename T2>
    class OtherType
    {
        static_assert(IsInstantiation<SomeType, T1>::value ||
            IsInstantiation<OtherType, T1>::value,
            "Event must have SomeType or OtherType as first type");
    public:
        explicit OtherType(T1 t1, T2 t2)
            : mT1{ std::move(t1) }
            , mT2{ std::move(t2) }
        {
        }
    
    private:
        T1 mT1;
        T2 mT2;
    };
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   max66    8 年前

    尝试使用

    template <typename, typename>
    class OtherType;
    
    template <typename T1, typename T2>
    using OtherTypeAlias = OtherType<T1, T2>;
    
    template <typename T1, typename T2>
    class OtherType
    {
        static_assert(IsInstantiation<SomeType, T1>::value ||
            IsInstantiation<OtherTypeAlias, T1>::value,
            "Event must have SomeType or OtherType as first type");
    

    问题:内部 OtherType ,当你写作时 其他类型 ,默认为 OtherType<T1, T2> ; 所以当你经过的时候 其他类型 作为的参数 IsIstantiation ,则传递的是模板类型,而不是模板模板。

    --编辑--

    我不知道,但可以直接引用里面的dry(没有模板默认参数) 其他类型 (谢谢你,巴里!)。

    所以要简单得多

    O不知道如何直接引用课堂内容 其他类型 --作为模板模板,没有默认的模板参数——在 其他类型

    template <typename T1, typename T2>
    class OtherType
    {
        static_assert(IsInstantiation<SomeType, T1>::value ||
            IsInstantiation<::OtherType, T1>::value,
            "Event must have SomeType or OtherType as first type");
    

    没有别名