#include <cstdlib>
template<typename T, std::size_t N>
constexpr std::size_t ARRAY_COUNT_FUNC(T (&arr)[N]) { return N; }
ではなく
#define ARRAY_COUNT_MACRO(arr) (sizeof(arr)/sizeof(*arr))
つを好むために、いくつかの理由がありますが、重要な違いは、ポインタ(ない配列)がARRAY_COUNT_MACRO
に渡されたとき、それは静かに役に立たない答えを返すことで、同じ引数をARRAY_COUNT_FUNC
に渡すと、間違いを指摘するコンパイラエラーが発生します。
マクロには利点があります。その引数は評価されていません。
#include <utility>
struct S {
int member_array[5];
};
// OK:
std::size_t count1 = ARRAY_COUNT_MACRO(std::declval<S&>().member_array);
// ERROR: std::declval is odr-used!
std::size_t count2 = ARRAY_COUNT_FUNC(std::declval<S&>().member_array);
両方の利点を併せ持つアプローチがありますか?つまり、引数が配列ではない場合にコンパイルエラーを引き起こし、引数をodr-useしないものです。
主は唯一のアイデアが最初に孵化したどのくらい前に知っているが、([Microsoftは、本質的に同じアルゴリズムを使用しています] http://blogs.msdn.com/b/the1/archive/2004/05 /07/128242.aspx)に '_countof(ar)'マクロを追加したもので、少なくとも'04以降です。チャンスは、おそらく彼らは誰か他の人から*恥知らず*リッピングしているでしょうか。 – WhozCraig