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?
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:
x
is a variable, this is x
multiplied by the instance of probe
.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.