【问题标题】:Use enable_if with two levels of templating将 enable_if 与两个级别的模板一起使用
【发布时间】:2017-07-20 10:21:15
【问题描述】:

我想使用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 {...};

我应该如何继续对 A 类型的 XY 进行专业化?

两次失败的尝试:

  1. 例如,声明A&lt;X&lt;int&gt; &gt; 类型的对象会产生错误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>
    { ... };
    

【问题讨论】:

    标签: c++ templates sfinae enable-if


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多