Search code examples
c++decltype

Getting the type of a typename or expression


Consider the following example. Somewhere in my code is a name x. I have no idea if x is a type or an object (it could be both). Is there any way to get the type of x, i.e., x itself if x is a type or decltype(x) if x is an object?

I tried doing something as trivial as

decltype(int)

but this yields an error, since int is not an expression. Is there any substitute way to do this?

I would like something like:

typedef int l;
mydecltype(l) x; // int x;
mydecltype(x) y; // int y;

How can I get this done?


Solution

  • namespace detail_typeOrName {
        struct probe {
            template <class T>
            operator T() const;
        };
    
        template <class T>
        T operator * (T const &, probe);
    
        probe operator *(probe);
    }
    
    #define mydecltype(x) decltype((x) * detail_typeOrName::probe{})
    

    In this code, (x) * detail_typeOrName::probe{} can be parsed two ways:

    • If x is a variable, this is x multiplied by the instance of probe.
    • If x is a type, this is the instance of probe dereferenced and cast to X.

    By carefully overloading operators, both interpretations are made valid, and both return the type we seek.

    Live on Coliru