オブジェクトからSTLコンテナのタイプを取得するには? たとえば、container
変数があり、それが であることを知っていますstd::vector<some type>
。イテレータを使用してコンテナを反復処理する必要があります。コンテナの型を知らずにイテレータを宣言する方法はありますか?
もちろん、コードから型を取得できますが、型を使用せずにそれを行うことに興味があります。また、私は C++11 を使用していません。
C ++ 11には、いくつかの簡単な方法があります。
auto it = container.begin();
または同等に:
decltype(container.begin()) it = container.begin();
あるいは:
decltype(container)::iterator it = container.begin();
それでも、型控除を使用できない場合でも、何らかの形式(おそらくテンプレートパラメーターを含む)で型を入力できない状況になることはありません。コンパイラがそれがどんなタイプであるかを知っているなら、あなたもそうします。
typedef std::vector<some_type> container;
for(container::const_iterator i = container.begin(); i != container.end(); ++i)
// ...
イテレータtypedefもあります(const_iteratorの代わりに使用できます)。ただし、c ++ 11を使用している場合は、autoまたはfor(auto& value: container) { ... }
フォームを使用してください。
タイプから取得するには:
container::value_type.
連想コンテナの場合。container::mapped_type
(container :: value_typeはペアに対応します)。これは、C++標準の第23章に準拠しています。
boost::is_sameを使用してタイプを比較します
オブジェクトインスタンスから取得するには:
auto it = container.begin();
1つの方法は、テンプレートを使用することです。
template <class container>
void dosomething(container &c) {
typename container::iterator it = c.begin();
typename container::iterator end = c.end();
while (it != end)
dosomething_with(*it);
}
状況によっては、次のようauto
な場合もあります。
for (auto it = container.begin(); it != container.end(); ++it)
dosomething_with(*it);
後者にはC++11が必要ですが、前者はC++98/03で使用できます。