2011-11-24 4 views
12

私はblogに次のテンプレートを見つけました:配列サイズのメタ関数 - どこかでブーストになっていますか?

template <typename T, size_t N> 
struct array_info<T[N]> 
{ 
    typedef T type; 
    enum { size = N }; 
}; 

それはsizeof(a)/sizeof(a[0])にエレガントな代替手段です。

配列のサイズを取得するために一般的に使用される構造体は、必ずライブラリのどこかにあるべきです。私はそれを知らない。誰でもこの機能が標準ライブラリのどこかにあるか、Boostにあると私に伝えることができますか?好ましくは、使い易くかつ軽量な形態であること。

+0

標準の関数 '_countof'(テンプレートバージョンが必要です)がありますが、現時点で適切なヘッダーが見つかりません。 – Vlad

+1

代わりにstd :: arrayを使用してください。 –

答えて

24

での使用例を参照してくださいしてみてください - boost::size()を:

5

新しいC++標準では、ヘッダーのstd :: arrayにはsize()メソッドがあり、constexprを返し、コンパイル時に使用できます。

は、あなたはおそらくマクロ_countof必要このことができます

std::array< YourType, N > arr; 
constexpr auto totalSize = arr.size() * sizeof(std::array< YourType, N >::value_type); 

希望...

+0

+1確かに: "C++の精神"の解決策を望むなら、 'std :: array'を使います。 –

0

のようなものにすることができるはずです。 http://www.cplusplus.com/forum/beginner/54241/によれば、#は<cstdio>で定義されています。しかし、Visual C++以外で利用できるかどうかはわかりません。

とにかく、ヘッダファイルを作成してそこに定義するのは複雑ではありません。


更新:
_countofは、Microsoft固有のですが、他のコンパイラについての議論がここにあります:Equivalents to MSVC's _countof in other compilers?

1

可能な場合は、可能であれば、私はまたstd::arrayまたはboost::arrayをお勧めします。つまり、boost::extentを使用して配列のサイズを取得し、boost::remove_all_extentsを使用して実際のタイプを取得することもできます。

C++ 11では、型特性は標準ライブラリでも利用できます。

編集:あなたの代わりにタイプで、変数を操作する関数を探している場合は、以下の

template <typename T, std::size_t N> 
std::size_t array_count(const T(&) [N]) { return N; } 

が、私は最終的に答えを自分で見つけhttp://ideone.com/IOdfp

+0

'boost :: extent'はオブジェクトではなく型で動作するようです。配列オブジェクト上で動作するものが必要です。 char * v [] = {/*...*/} ' – paperjam

+0

@paperjamの' v'。私はあなたが望むものを忘れてしまった。私の更新を参照してください。 –

関連する問題