愚かなC ++トリック:より良いsizeof_array()
コードの最初に:
テンプレート<型名のTy、民size_tの> CHAR(&CountOfRequireArrayArgumentT(CONSTのTy(&)[数字]))[数字]。 #define BX_COUNTOF(_x)はsizeof(BX :: CountOfRequireArrayArgumentT(_x))
-------------------------------------------------- -------------------------------------------------- ---------------------
簡単な文言は:(ある常にAよく知られている人間のソリューションは、すべての問題にあります- 、きちんともっともらしい、そして間違いました)
#define sizeof_array(X)(はsizeof(X)/はsizeof(X [0]))
これはマクロですので、しかし、何のタイプは限り法的声明を展開し、チェックしません。
#define BAD_SIZEOF_ARRAY(X)(はsizeof(X)/はsizeof(X [0])) 主INT() { int型IA [10]。 std ::ベクトル<ダブル> DV。 std ::文字列s。 フロート* FP; std :: printfの( "BAD_SIZEOF_ARRAY(IA):%dの\ n"は、BAD_SIZEOF_ARRAY(IA)); std :: printfの( "BAD_SIZEOF_ARRAY(DV):%dの\ n"は、BAD_SIZEOF_ARRAY(DV)); std :: printfの( "BAD_SIZEOF_ARRAY(S):%d個\ n"は、BAD_SIZEOF_ARRAY(S)); std :: printfの( "BAD_SIZEOF_ARRAY(FP):%dの\ n"は、BAD_SIZEOF_ARRAY(FP)); }
C ++は、そこにマクロ機能をチェックする強いタイプではありませんが、可能にダックタイピングの(HA興味深いです)。
-------------------------------------------------- --------------------------------------------
第1の上に書かれたと、のみ静的配列の使用を確保するために。以下の説明
1. テンプレート<型名T、N size_tの>ボイドOnlyTakesArray(T(・)[N])。
タイプT、パラメータ参照用の長さNの静的配列を受ける関数テンプレート署名。何も間違っています。
1.5:あなたはこの書きたい場合:Nへの直接のリターンを、あなたは問題を抱えていることがあります。
テンプレート<型名T、size_tのN> size_tのsizeof_array(T(・)[N]) { Nを返します。 }
いくつかの古いコンパイラ(または全くインライン最適化、またはこれは、コンパイル時定数でコンパイラに伝えるために、C ++ 11 constexprの他の方法に類似することはできませんが)どの手段コンパイラはこの期間Nを使用することができないことを、実行時の関数を生成します
2.「はsizeof(チャー)はsizeof(signed char型)およびsizeof(unsigned char型)が1です」
私たちは、[N]アウト文字を前方に配置する方法を見つけるために持っているので、そうはsizeof(char型[N])は、Nです。
テンプレート<型名T、size_tのN> CHAR(&sizeof_array(T(・)[N]))[N]。
CHAR(およびXXX())[N]の平均、XXX()この関数は、[N]参照の文字を返します。==!
3.「のsizeof演算子は、そのオペランドのオブジェクト表現のバイト数を与えます。オペランドは評価されない式、または括弧タイプIDのいずれかです。」
私たちは、この機能を実現する必要はありません意味Sizeof_array。良いです。