C++11 countof

Наверняка многие используют макрос, подобный нижеприведенному:

#define countof(array) (sizeof(array)/sizeof(array[0]))

Он хорош до тех пор, пока в качестве array в него не будет передан указатель на array. Компилятор проглотит и ничего не скажет, а результат будет совсем не тот, которого ожидает разработчик.

Благодаря constexpr появившемуся в C++11 есть возможность сделать безопасный countof.

template <class T, size_t N>
constexpr size_t countof(const T (&)[N]) noexcept
{
    return N;
}

Теперь на этапе компиляции произойдет ошибка:

const int values[] = { 42, 76, 16, 11, 31 };

void foo(const int v[])
{
   for (size_t i = 0; i < countof(v); ++i) // <-- compilation error!
   {
      bar(v[i]);
   }
}

Версия для C++98 может быть такой:

template <typename T, size_t N>
char (&CountOfHelper(T(&)[N]))[N];
#define countof(x) sizeof(CountOfHelper(x))

2 comments

  • slackwarrior

    Про “нагоняй за неуместное использовние тега С++ в теме про F-35”, спасибо поржал — это ты просто с перегрином не в теме, на чем написан софт F-35 и как это связано с задержками и фейлами в программе JSF, и почему хвостострел каждый раз нестерпевает, хотя это правда (и он сам признал, прежде чем удолил тему). Некое “целевое использование” тегов в толксах — вахтерство это и размахивание банхаммером — в чем хвостогуня не признается, даже уже вступив в дискуссию и испытав очередной багет от недостатка аргументов не основанных на эмоциях, но ты-то не опускайся до. Превед.

Leave a Reply

Your email address will not be published. Required fields are marked *