考虑以下示例。我的代码中某处是x
。我不知道x
是类型还是对象(可能是两者)。有什么方法可以获取x
的类型,即,如果x
是类型,则可以获取x
本身,如果decltype(x)
是对象,则可以获取x
吗?
我尝试做一些琐碎的事
decltype(int)
但这会产生错误,因为
int
不是表达式。有什么替代方法可以做到这一点吗?我想要类似的东西:
typedef int l;
mydecltype(l) x; // int x;
mydecltype(x) y; // int y;
我怎样才能做到这一点?
最佳答案
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{})
在此代码中,可以通过两种方式解析
(x) * detail_typeOrName::probe{}
:x
是一个变量,则将x
乘以probe
的实例。 x
是类型,则这是probe
的实例,该实例已取消引用并转换为X
。 通过小心地重载运算符,这两种解释都将变为有效,并且都返回我们要查找的类型。
Live on Coliru