繁体   English   中英

使用enable_if专门处理基类的返回类型

[英]using enable_if to specialize on return type from a base class

我正在将一个大型代码库移植到clang(使用g ++和intel c ++构建)。 与以下代码段相似的代码可以在g ++ 4.8-6.2上编译并运行,但无法使用lang 3.8和3.9编译。 MinOp的第二次调用(AFAICT)应该获得基类的特殊化(“不要叫我!”),但是clang尝试实例化std :: min版本,但失败:

#include <algorithm>
#include <iostream>
#include <type_traits>

template <typename T> class Vector
{
public:
    Vector() : xyz{} {}
    Vector(T const &x, T const &y, T const &z) : xyz{y, y, z} {}
    Vector<T> min(Vector<T> const &v) { return Vector<T>(std::min(xyz[0], v.xyz[0]), std::min(xyz[1], v.xyz[1]), std::min(xyz[2], v.xyz[2])); }
    T xyz[3];
};

class MinOpBase
{
public:
    template <class T> typename std::enable_if<!std::is_fundamental<T>::value>::type
    operator()(Vector<T> &left, Vector<T> const &right) const { std::cout << "Don't call me!" << std::endl; }
};

class MinOp : public MinOpBase
{
public:
    template <typename T> void operator()(T &left, T const &right) const
    { left = std::min(left, right); }

    // Support component-wise min on vectors of fundamental types
    template <typename T> typename std::enable_if<std::is_fundamental<T>::value>::type
    operator() (Vector<T>  &left, Vector<T>  const &right) const
    {  left.min(right); }

    using MinOpBase::operator();
};

int main()
{
    Vector<double> v1, v2;
    Vector<Vector<double>> vv1, vv2;
    MinOp m;
    m(v1,v2);
    m(vv1,vv2);
}

请注意,如果没有基类(MinOpBase),则“不要叫我!” 专业化直接在MinOp类中, clang也可以使用

使用using语句从基类引入专业化是否有效?

在我看来,这似乎是一堆价值不高的机器(尽管当然它已简化为几乎毫无意义的点)。 更好的主意?

一位同事指出,我的问题是SFINAE的重复版本, 不适用于llvm / clang

我认为结论是clang按照标准在做“正确的”事情是正确的。 来自Johannes Schaub-litb的答案:

C ++ 11的7.3.3 p15(将忽略继承函数模板的using声明,因为它的名称和参数与派生类的成员函数模板相同)

尽管其他编译器正在执行可能应该是“正确”的事情。 我不知道这是否已报告为标准中的缺陷。

解决方法包括将所有专长放入基类中,或修改专长之一的参数类型之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM