我一直在使用下面显示的方法强制编译器向我大喊一个变量类型:
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时停止.