2017-07-20 96 views
1

我想使用enable_if来为某些类型定义一个类。在这些类型中,我需要使用一些模板类型,并且我无法使其工作。这里是一个MWE:使用具有两级模板的enable_if

模板类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 {...}; 

我应该如何继续专门为我的课AXY类型?

两次尝试不工作:

  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> 
    { ... }; 
    

回答

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>> {}; 
专业化
相关问题