2016-05-29 23 views
19

Wie der Titel schon sehr verwirrend aussehen könnte, lassen Sie mich Ihnen ein Beispiel geben:typedef der Anordnung von typedefs von Array

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

So ist what_am_i ein [4][2] dimensionales Array wie nehme ich an, oder ein [2][4] dimensionales Array?

Antwort

3

Nachdem die Variable über den Debugger Inspektion, fand ich, dass ich Recht hatte - what_am_i ist ein [4][2] dimensionales Array.

21

Es ist bool[4][2] Sie es von static_assert überprüfen können:

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

Um @Slardar Zhangs C zu vervollständigen ++ für C beantworten:

Es bool[4][2] ist.

Sie können entweder durch eine der folgenden Möglichkeiten überprüfen:

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

foo ist ein Array mit Elementen des Typs 2bool, d.h. bool[2].

bar ist ein Array mit 4 Elemente vom Typ foo, d.h. foo[4], jedes Element ein bool[2].

Dann ist what_am_ibool[4][2].

1

Wenn Sie nicht den Typ einer Variablen kennen, einer der einfache Möglichkeiten, ist dieser Trick:

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

dann tun:

tag_type<void> t = tag<some_type>; 

fast jeder Compiler ausspucken ein einigermaßen lesbar "Sie können nicht tag_type<full_unpacked_type> zu tag_type<void> zuweisen" oder somesuch (vorausgesetzt, Ihr Typ ist nicht void das ist).

Sie können auch überprüfen Sie mit

tag_type<your_guess> t = tag<some_type>; 

eine gute Vermutung haben manchmal wünschen Sie some_type über decltype(some_expression) zu erzeugen.

+0

oder Sie können 'cout << typeid (what_am_i) .name()' -nach dem Piping durch C++ filt, meldet es 'bool [4] [2]'. – Kundor