check if member exists using enable_if

前端 未结 6 1292
鱼传尺愫
鱼传尺愫 2020-11-28 13:40

Here\'s what I\'m trying to do:

template  struct Model
{
    vector vertices ;

    #if T has a .normal member
    void transform(         


        
6条回答
  •  难免孤独
    2020-11-28 13:58

    I know that it's little late, however...

    typedef int Matrix;
    
    struct NormalVertex {
        int pos;
        int normal;
    };
    
    struct Vertex {
        int pos;
    };
    
    template  struct Model
    {
        typedef int No;
        typedef char Yes;
    
        template static decltype (declval().normal, Yes()) has_normal(U a);
        static No has_normal(...);
    
        vector vertices ;
    
        template 
        typename enable_if())) == sizeof(Yes), void>::type
        transform( Matrix m )
        {
            std::cout << "has .normal" << std::endl;
            for (auto vertex : vertices)
            {
              vertex.pos = m * vertex.pos ;
              vertex.normal = m * vertex.normal ;
            }
        }
    
        template 
        typename enable_if())) == sizeof(No), void>::type
        transform( Matrix m )
        {
            std::cout << "has no .normal" << std::endl;
            for (auto vertex : vertices)
            {
              vertex.pos = m * vertex.pos ;
            }
        }
    } ;
    
    int main()
    {
        Matrix matrix;
        Model  normal_model;
    
        Vertex simple_vertex;
        Model  simple_model;
    
        simple_model.transform(matrix);
        normal_model.transform(matrix);
    
        return 0;
    }
    

提交回复
热议问题