c – 是否可以使用强制编译器错误扩展typedef?

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

template <class T>
struct show_type;

使用所需的变量使编译器错误的结构类型不完整:

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

所以GCC 5.3.0会产生错误:

invalid use of incomplete type ‘struct show_type<int>

和MSVC 2015:

show_type<s32>‘: no appropriate default constructor available

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

最佳答案

Now I wonder if there is a way to force an error to show full hierarchy of typedefs (that is, s32 -> int32_t -> int), or at least newest typedef and first original type?

没有这样的等级. 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时停止.

点赞