2012-02-18 12 views
0

シーケンスのサイズを決めたい。 STLのすべてのシーケンスに対して、私は.size()メンバ関数を使用できますが、シーケンスが配列の場合は問題になります。引数として渡されたシーケンスが配列型かSTL配列型かをプログラムで判断する方法はありますか?共通のインターフェースを使ってシーケンスのサイズを調べる

template<typename sequence> 
size_t find_size(sequence& s) 
{ 
// if s has .size() member function 
// return s.size() 
//else if it is an array type 
// return sizeof(s) 
//else throw error 
} 

は基本的に私はC++ 11

PSにおける非会員のサイズ、我々は非会員が始まる持っているだけのような関数()とend()を探しています:順序で私は、シーケンスとしての意味しますSTLで定義されています(すべてが.size()メンバー関数を持ちます)。

答えて

3

アレイのfind_size関数のオーバーロードによってこれを行うことができます。

// This overload expects an array to be passed by reference. 
template<typename T, size_t N> 
size_t find_size(T (&)[N]) { 
    return N; 
} 

// This overload takes any other type that supports T::size(). 
template<typename T> 
size_t find_size(T c) { 
    return c.size(); 
} 

しかし、これはポインタに分解された配列では機能しません。また、Cライブラリを使用していない限り、私はいつもCスタイルの配列よりもstd::arrayを使うことを勧めます。

+0

実際には、どのようなシーケンスタイプにも依存しないように、このようなインターフェイスが必要です。 –

+0

あなたが何を求めているのか分かりません。あなたは2つではなく1つの関数だけを使って同じ結果を得たいですか? –

+0

関数のオーバーロードも問題ありません。 –

1

次のようなものを使用することができます。

template<typename T> 
size_t find_size(const T& c) 
{ 
    return distance(begin(c), end(c)); 
} 

私はそれがどのような方法で効率的であることを主張しませんが。シーケンスのサイズを取得することは、そのシーケンスとは無関係ではありません(例えば、リンクされたリストのサイズが基本的にベクトルのサイズを見つけることと異なる場合)。 .sizeを実装していない特定のタイプのシーケンス

1

あなたは実際にシーケンスが何であるか(そして何でないか)詳細を説明していませんが、Boost.Rangeとコンセプトと実行が似ているとしたらboost::sizeですあなたの興味を引く。

関連する問題