Different template syntax for finding if argument is a class or not

前端 未结 2 1601
说谎
说谎 2020-12-15 10:58

While reading this question , I came across @Johannes\'s answer.

template struct void_ { typedef void type; };

template

        
相关标签:
2条回答
  • 2020-12-15 11:20

    1. line 1 is used for something which is not a class, like int, long and so on ...

    for example:

    class foo {};
    
    if (is_class<foo>::value) // is a class
        line_2 called
    else  // if not
        line 1 called
    

    because of there is a partial specialization so line 1 is what you have to have, otherwise you will get an error if you pass a type which is not a class (such as char *, long, int ...)

    2: the key of int T::* is "::*", it is a standard operator in c++

    means a pointer points to a member of a class, can be both a function or a data field, and in this case it means anyone who has a member or can work with a member pointer, this is only works for classes, structs, or unions in c++, so the result of that, you will know the parameter is or not a class.

    btw, google some keywords like: c++ template, partial specialization, and type traits, or boost type traits

    hope this is useful for you :)

    0 讨论(0)
  • 2020-12-15 11:32

    Line 1: Choosing the partial specialization below if the test succeeds.

    Line 2: int T::* is only valid if T is a class type, as it denotes a member pointer.

    As such, if it is valid, void_<T>::type yields void, having this partial specialization chosen for the instantiation with a value of true. If T is not of class type, then this partial specialization is out of the picture thanks to SFINAE and it defaults back to the general template with a value of false.

    Everytime you see a T::SOMETHING, if SOMETHING isn't present, be it a type, a data member or a simple pointer definition, you got SFINAE going.

    0 讨论(0)
提交回复
热议问题