使用 enable_if 检查成员是否存在

时间:2023-03-11
本文介绍了使用 enable_if 检查成员是否存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

这是我想要做的:

template <typename T> struct Model
{
    vector<T> vertices ;

    #if T has a .normal member
    void transform( Matrix m )
    {
        each vertex in vertices
        {
          vertex.pos = m * vertex.pos ;
          vertex.normal = m * vertex.normal ;
        }
    }
    #endif

    #if T has NO .normal member
    void transform( Matrix m )
    {
        each vertex in vertices
        {
          vertex.pos = m * vertex.pos ;
        }
    }
    #endif
} ;

我见过 使用enable_if的>示例,但我不明白如何将enable_if应用于这个问题,或者它是否可以应用.

I've seen examples of using enable_if, but I cannot understand how to apply enable_if to this problem, or if it even can be applied.

推荐答案

这在 C++11 中变得方式更容易.

This has become way easier with C++11.

template <typename T> struct Model
{
    vector<T> vertices;

    void transform( Matrix m )
    {
        for(auto &&vertex : vertices)
        {
          vertex.pos = m * vertex.pos;
          modifyNormal(vertex, m, special_());
        }
    }

private:

    struct general_ {};
    struct special_ : general_ {};
    template<typename> struct int_ { typedef int type; };

    template<typename Lhs, typename Rhs,
             typename int_<decltype(Lhs::normal)>::type = 0>
    void modifyNormal(Lhs &&lhs, Rhs &&rhs, special_) {
       lhs.normal = rhs * lhs.normal;
    }

    template<typename Lhs, typename Rhs>
    void modifyNormal(Lhs &&lhs, Rhs &&rhs, general_) {
       // do nothing
    }
};

注意事项:

  • 您可以在 decltypesizeof 中命名非静态数据成员,而无需对象.
  • 您可以申请扩展的 SFINAE.基本上可以检查任何表达式,如果在替换参数时它无效,则模板将被忽略.
  • You can name non-static data members in decltype and sizeof without needing an object.
  • You can apply extended SFINAE. Basically any expression can be checked and if it is not valid when the arguments are substituted, the template is ignored.

这篇关于使用 enable_if 检查成员是否存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:具有附加可选模板参数的标准库容器? 下一篇:从 std::function 调用签名推导出模板参数

相关文章