2016-05-29 16 views
19

Come il titolo potrebbe sembrare molto confuso, lasciate che vi faccia un esempio:typedef di serie di typedef di serie

typedef bool foo[2]; 
typedef foo bar[4]; 
bar what_am_i; 

Quindi, è what_am_i un [4][2] array bidimensionale come presumo, o un array bidimensionale [2][4]?

risposta

3

Dopo aver ispezionato la variabile tramite il debugger, ho scoperto che avevo ragione - what_am_i è un array bidimensionale [4][2].

21

E 'bool[4][2] È possibile verificarlo dal static_assert:

static_assert(std::is_same<decltype(what_am_i), bool[4][2]>::value, ""); 
static_assert(std::is_same<decltype(what_am_i), bool[2][4]>::value, ""); // failed 
6

Al fine di completare C di @Slardar Zhang ++ rispondere di C:

E 'bool[4][2].

È possibile verificare entro uno di quanto segue:

  • sizeof(what_am_i)/sizeof(*what_am_i) == 4
  • sizeof(*what_am_i)/sizeof(**what_am_i) == 2
13

foo è un array con 2 elementi di tipo bool, cioè bool[2].

bar è un array con 4 elementi di tipo foo, cioè foo[4], ogni elemento è un bool[2].

Quindi what_am_i è bool[4][2].

1

Quando non si conosce il tipo di una variabile, uno dei modi più semplici è questo trucco:

template<class T> struct tag_type{using type=T;}; 
template<class T> constexpr tag_type<T> tag{}; 

quindi fare questo:

tag_type<void> t = tag<some_type>; 

quasi ogni compilatore sputare fuori un ragionevolmente leggibile "non è possibile assegnare tag_type<full_unpacked_type> a tag_type<void>" o somesuch (presumendo che il tipo non sia void).

Si può anche verificare di avere una buona congettura con

tag_type<your_guess> t = tag<some_type>; 

volte si desidera generare some_type via decltype(some_expression).

+0

oppure si può 'cout << idid (what_am_i) .name()' -dopo piping attraverso C++ filt, riporta 'bool [4] [2]'. – Kundor