使用带有两个模板级别的enable_if

时间:2017-07-20 10:21:16

标签: c++ templates sfinae enable-if

我想使用enable_if为某些类型定义一个类。在这些类型中,我需要使用一些模板化类型,我无法使其工作。这是一个MWE:

模板类A

template<typename T, typename Enable = void> class A;

它对一些简单类型的专门化,例如这里的整数类型,可以定义如下:

template<typename T>
class A<T, std::enable_if<std::is_integral<T>::value>::type>
{ ... };

现在我定义了一堆模板化类型:

template<typename U> class X {...};
template<typename U> class Y {...};

如何针对类型AX专门研究课程Y

两次尝试不起作用:

  1. 使用以下内容,声明类型为A<X<int> >的对象会产生错误incomplete type

    template<typename U>
    template<typename T>
    class A<T, std::enable<std::is_same<T, X<U> >::value 
                        || std::is_same<T, Y<U> >::value>::type> 
    { ... };
    
  2. 如下所示,错误为'T' is not a template

    template<typename U>
    template<typename T>
    class A<T<U>, std::enable<std::is_same<T, X>::value 
                           || std::is_same<T, Y>::value>::type>
    { ... };
    

1 个答案:

答案 0 :(得分:5)

XY类模板,而不是类型。您的编译器正在抱怨在第二个示例中将类型用作类模板。

如果你想为他们专业化

template<typename>
class A;

template<typename T>
class A<X<T>> : A_for_XY<X<T>> {};

template<typename T>
class A<Y<T>> : A_for_XY<Y<T>> {};