Kompilieren Sie time sizeof_array ohne Verwendung eines Makros

Dies ist nur etwas, das mich in den letzten Tagen gestört hat. Ich glaube, es ist nicht möglich, es zu lösen, aber ich habe schon einmal Schablonenmagie gesehen.

Hier geht:

Um die Anzahl der Elemente in einem Standard-C ++ - Array zu ermitteln, könnte ich entweder ein Makro (1) oder eine typsichere Inline-Funktion (2) verwenden:

(1)

#define sizeof_array(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))

(2)

template <typename T>
size_t sizeof_array(const T& ARRAY){
    return (sizeof(ARRAY)/sizeof(ARRAY[0]));
}

Wie Sie sehen, hat der erste das Problem, ein Makro zu sein (im Moment halte ich das für ein Problem), und der andere das Problem, nicht in der Lage zu sein, die Größe eines Arrays beim Kompilieren abzurufen. dh ich kann nicht schreiben:

enum ENUM{N=sizeof_array(ARRAY)};

oder

BOOST_STATIC_ASSERT(sizeof_array(ARRAY)==10);// Assuming the size 10..

Weiß jemand, ob dies gelöst werden kann?

Aktualisieren:

Diese Frage wurde erstellt, bevor constexpr eingeführt wurde. Heutzutage können Sie einfach verwenden:

template <typename T>
constexpr auto sizeof_array(const T& iarray) {
    return (sizeof(iarray) / sizeof(iarray[0]));
}

Antworten auf die Frage(10)

Ihre Antwort auf die Frage