【问题标题】:C++ - variadic template partial specializationC++ - 可变参数模板偏特化
【发布时间】:2016-02-09 17:21:05
【问题描述】:

让我们来个简单的sn-p:

template<class T, class... Args>
struct A {
    void operator()() { std::cout << "A"; }
};

template<class T, class... Args>
struct A<T, double, Args...> {
    void operator()() { std::cout << "B"; }
};

template<class T, class B, class... Args>
struct A<T, B, double, Args...> {
    void operator()() { std::cout << "C"; }
};

我可以这样使用:

int main() {
    A<int, int, int> a;
    A<int, double, int> b;
    A<int, int, double> c;
    a(); b(); c();
    return 0;
}

它正确返回"ABC"。但是当我声明 A&lt;int, double, double&gt; d; 时,我显然得到了编译时错误 ambiguous class template instantiation for struct A&lt;int, double, double&gt;

问题是:我可以做一些技巧(可能使用 SFINAE)来考虑第二个模板参数,因为它将具有更高的优先级并且会使用返回 B 的专业化? (忽略第三位的double

注意:doubleint 类型用于简化示例,我将使用类型特征。因此,我想避免将专业化作为解决方案:

template<class T, class... Args>
struct A<T, double, double, Args...> {
    void operator()() { std::cout << "D"; }
};

【问题讨论】:

    标签: c++11 variadic-templates specialization


    【解决方案1】:

    正如您所建议的,如果第二个模板参数是 double,您可以使用 SFINAE 不考虑 C 特化:

    template<typename, class T, class... Args>
    struct A_impl {
        void operator()() { std::cout << "A"; }
    };
    
    template<class T, class... Args>
    struct A_impl<void, T, double, Args...> {
        void operator()() { std::cout << "B"; }
    };
    
    template<class T, class B, class... Args>
    struct A_impl<typename std::enable_if<!std::is_same<B,double>::value>::type,
             T, B, double, Args...> {
        void operator()() { std::cout << "C"; }
    };
    
    template<class T,class... Args>
    using A = A_impl<void,T,Args...>;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-15
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多