【问题标题】:How can I explicitly view the results of type inference by auto?如何通过自动显式查看类型推断的结果?
【发布时间】:2015-07-07 03:18:34
【问题描述】:

我正在研究 C++11/14 的自动特性。

出于教育目的,我想明确显示我的代码类型推断的结果。 我试过 typeid().name(),但我发现这种方法有两个问题。

  1. 输出有时难以理解。 (例如,“NSt3__16vectorIiNS_9allocatorIiEEEE”)
  2. 似乎没有显示 const/volatile 修饰符。

@πάνταῥεῖ 我曾尝试使用您指出的 abi::__cxa_demangle()。 问题1解决了,谢谢,但是typeid().name()好像没有包含CV修饰符信息。 我认为使用auto关键字有一些陷阱,所以我想看看类型推断的确切结果,包括CV修饰符和引用类型。

我在 mac os 10.10.3 上使用 clang 6.1.0,但如果可能的话,我想知道可移植的方式。

【问题讨论】:

  • @JBL 不需要是同一个问题,只要有合适的答案,恕我直言。
  • @πάνταῥεῖ 好吧,对此最实际的答案不在副本上,也不适合恕我直言,但是……(尽管确实有可以帮助他的答案)
  • @JBL 好吧,我将重新提出问题,您可以发布更好的答案。
  • 你使用的是什么编译器和操作系统?
  • thisthis是什么意思?

标签: c++ c++11 type-inference


【解决方案1】:

试试 Scott Meyers 提出的方法(有效的现代 C++):

声明一个模板(但不要定义它)

template<typename T>       // declaration only for TD;
class TD;                  // TD == "Type Displayer"

然后使用你的类型实例化这个模板

TD<decltype(x)> xType

编译器现在会抱怨这个不完整的类型(通常会显示它的全名)

错误:聚合 'TD xType' 类型不完整,无法定义

参见“Effective Modern C++”的第 4 条(通常我建议这本书为“必读”)

【讨论】:

  • 啊该死的,这是同一个想法! :D
  • @JBL 不太一样。 decltype(x) 可能是引用类型,而代码中的 T 永远不会是引用类型。
  • @JBL:正如我所说:必读...所以其他人也读过它并不令人惊讶...
  • 啊,对了,没听清楚.. 但是使用decltype 是唯一的方法吗?
  • 非常感谢您的快速回复!实际上我开始阅读“有效的现代 C++”,我想检查第 1 项的实际行为......
【解决方案2】:

Type Index library 最近被添加到 Boost。它试图解决您提到的一些问题。

例子:

cout << boost::typeindex::type_id<int const volatile*>().pretty_name() << endl;
cout << boost::typeindex::type_id_with_cvr<int const&>().pretty_name() << endl;

打印:

int const volatile*
int const&

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2012-12-29
    • 2012-06-02
    • 2022-11-24
    相关资源
    最近更新 更多