2016-08-30 32 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

相關問題