【问题标题】:Is it possible to expand typedef with forced compiler error?是否可以使用强制编译器错误扩展 typedef?
【发布时间】:2016-08-30 17:28:01
【问题描述】:

我一直在使用下面显示的方法来强制编译器对我大喊变量类型:

template <class T>
struct show_type;

将它与所需的变量一起使用,因此编译器会出错一个不完整的结构类型:

typedef int32_t s32;
s32 a;
show_type<decltype(a)>();

所以 GCC 5.3.0 产生错误:

不完整类型'struct show_type&lt;int&gt;'的使用无效

和 MSVC 2015:

'show_type&lt;s32&gt;': 没有合适的默认构造函数可用

现在我想知道是否有办法强制错误显示typedefs(即s32 -&gt; int32_t -&gt; int)的完整层次结构,或者至少是最新的typedef 和第一个原始类型?我不介意肮脏或邪恶的把戏。

【问题讨论】:

  • typedefs 是简单的别名,而不是单独的类型。你可能是在暴露错误的树。请提供带有上下文的minimal reproducible example
  • @πάνταῥεῖ 对于第 4 阶段后的编译逻辑来说确实如此,但是在第 4 阶段中没有语法检查,所以也许,有机会,这不是不可能的吗?真的不知道,这就是我问的原因。
  • what typedefs 的完整层次结构?在什么情况下? what 的第一个原始类型?我不清楚您实际要求的是什么。

标签: c++ typedef incomplete-type


【解决方案1】:

现在我想知道是否有办法强制错误显示 typedef 的完整层次结构(即s32 -&gt; int32_t -&gt; int),或者至少是最新的 typedef 和第一个原始类型?

没有这样的层次结构。 s32 int32_t int。没有办法区分这三种类型,因为它们实际上不是三种不同的类型。其中两个只是别名。


您真正需要的是静态反射,或P0194。这将允许您执行以下操作:

using meta_s32   = reflexpr(s32);
using meta_int32 = meta::get_aliased_t<meta_s32>;
using meta_int   = meta::get_aliased_t<meta_int32>;
std::cout << meta::get_name_v<meta_s32> << ", "
          << meta::get_name_v<meta_int32> << ", "
          << meta::get_name_v<meta_int> << '\n';

您可以通过反复向上使用get_aliased_t 并在is_alias_v 产生false_type 时停止来生成反射层次结构。

【讨论】:

  • +1,甚至不知道这样的事情甚至被认为已实现,但在我看来,它对于强大的 typedefed 项目非常有用
  • @BlackMoses 好吧,这只是一个工作组提出的建议。目前尚不清楚它何时/是否会成为 C++ 标准的一部分。
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多