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

时间:2016-08-30 17:28:01

标签: c++ typedef incomplete-type

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

<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和第一个原始类型?我不介意肮脏或邪恶的伎俩。

1 个答案:

答案 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时停止。

相关问题