考虑以下示例。我的代码中某处是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

    10-06 15:24