【问题标题】:Getting the type of a typename or expression获取类型名或表达式的类型
【发布时间】:2016-11-22 13:25:38
【问题描述】:

考虑以下示例。在我的代码中某处有一个名字x。我不知道x 是类型还是对象(可能两者兼有)。有什么方法可以获取x 的类型,即如果x 是一个类型,则为x 本身,如果x 是一个对象,则为decltype(x)

我试着做一些微不足道的事情

decltype(int)

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

我想要类似的东西:

typedef int l;
mydecltype(l) x; // int x;
mydecltype(x) y; // int y;

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

【问题讨论】:

  • 你是怎么得到一个你不知道它是类型还是对象的名字的?这个名字从何而来?问题陈述对我来说没有意义;感觉就像XY problem
  • 我想添加更多背景,但解释会非常冗长。我正在处理从其他类继承的类的预处理指令和初始化列表。在初始化列表中,类型和成员名称具有相同的格式,我无法从语法中区分它们。
  • 这绝对是一个XY问题,但我无法描述整个问题,因为它不仅仅是“我需要一个文件扩展名”那么简单:)
  • @akappa:他可能做不到。显然,这是一个糟糕的设计,但如果是某个老项目,他的工作描述可能是无论如何都要去做。
  • @akappa 可能是。现在,让我们玩这个小游戏:你是一名员工,你的老板告诉你做一些愚蠢的事情。你到底要做什么? “不,我不会这样做,那太愚蠢了!”?回答问题时请记住这一点。

标签: c++ decltype


【解决方案1】:
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

【讨论】:

  • 伙计,你让我起鸡皮疙瘩。
  • 这真是太聪明了!我从没想过以这种方式滥用取消引用和强制转换运算符。希望这在未来不会中断,因此必须由一些不幸的、无能的维护者来处理......
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2020-09-24
  • 2012-05-11
  • 1970-01-01
相关资源
最近更新 更多