2016-08-30 30 views
4

我已经使用以下所示方法来强制编译器在我叫喊的变量类型:是否有可能通过强制编译器错误来扩展typedef?

template <class T> 
struct show_type; 

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

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

所以GCC 5.3 0.0产生错误:

invalid use of incomplete type ' struct show_type<int> '

而且MSVC 2015:

' show_type<s32> ': no appropriate default constructor available

现在,我不知道是否有办法迫使错误显示的typedef S(即,s32 -> int32_t -> int)完整的层次,或者至少最新typedef和第一原始类型?我不介意肮脏或邪恶的伎俩。

+1

'typedefs'是简单的别名,而不是它们自己的类型。你可能会阻止错误的树。请提供一个[MCVE]。 –

+0

@πάνταῥεῖ后阶段4编译逻辑是这样,但在阶段4没有语法检查,所以它可能有,这不是不可能或什么?真的不知道,这就是我问的原因。 – xinaiz

+0

* * typedef的全部层次结构?在什么情况下?第一个原始类型* what *?我不清楚你实际要求什么。 – Barry

回答

2

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?

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


你真正想要的是静态反射或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产生反射层次。

+0

+1,甚至不知道这样的事情甚至被认为是实施,但在我看来,它是非常有用的强大的'typedef'ed项目 – xinaiz

+0

@BlackMoses那么,这只是一个工作组提出的建议。目前还不清楚它是否会成为C++标准的一部分。 – Barry

相关问题