我一直在使用下面显示的方法强制编译器向我大喊一个变量类型:
<salesforce.upsert configKey="sfdc_connection_dtls">
<!-- sobject goes here -->
</salesforce.upsert>
将它与所需的变量一起使用,使编译器错误的结构类型不完整:
template <class T>
struct show_type;
因此GCC 5.3.0产生错误:
无效使用不完整类型“
typedef int32_t s32; s32 a; show_type<decltype(a)>();
”
和MSVC 2015:
'
struct show_type<int>
':没有合适的默认构造函数
现在我想知道是否有办法强制错误显示show_type<s32>
s的完整层次结构(即typedef
),或至少最新的s32 -> int32_t -> int
和第一个原始类型?我不介意肮脏或邪恶的伎俩。
答案 0 :(得分:2)
现在我想知道是否有办法强制错误显示typedef的完整层次结构(即
s32 -> int32_t -> 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
时停止。