Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the type of a typename or expression

Tags:

c++

decltype

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?

like image 519
Matteo Monti Avatar asked Jul 19 '16 14:07

Matteo Monti


1 Answers

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

like image 54
Quentin Avatar answered Nov 17 '22 03:11

Quentin