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.
Live on Coliru
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With