获取typename或表达式的类型

时间:2016-07-19 14:58:57

标签: c++ decltype

考虑以下示例。我的代码中的某处是名称ADDRESS。我不知道x是一个类型还是一个对象(它可能都是)。有没有办法获得x的类型,即x本身x是一个类型,还是x如果decltype(x)是一个对象?

我尝试做一些像

这样简单的事情
x

但这会产生错误,因为decltype(int) 不是表达式。有没有替代方法可以做到这一点?

我想要像:

int

我怎样才能完成这项工作?

1 个答案:

答案 0 :(得分:23)

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