CLX C++ Libraries
Home >> container_wrapper

Declarations

template <class Type, class Alloc = std::allocator<Type> >
class vector_wrapper;

template <class Type, class Alloc = std::allocator<Type> >
class deque_wrapper;

template <class Type, class Alloc = std::allocator<Type> >
class list_wrapper;

template <
    class Key,
    class Compare = std::less<Key>,
    class Alloc = std::allocator<Type> >
>
class set_wrapper;

template <
    class Key,
    class Compare = std::less<Key>,
    class Alloc = std::allocator<Type> >
>
class multiset_wrapper;

template <
    class Key,
    class Type,
    class Compare = std::less<Key>,
    class Alloc = std::allocator<Type> >
>
class map_wrapper;

template <
    class Key,
    class Type,
    class Compare = std::less<Key>,
    class Alloc = std::allocator<Type> >
>
class multimap_wrapper;

Overview

ファイルの解析など何らかの操作を行った結果をコンテナに格納し, そのコンテナから各情報を取得するようなコードを書く機会にしばしば遭遇します. このとき,まず始めに思いつくのが,対象となる STL のコンテナ・クラスを継承して 独自のメソッドのみを定義して拡張すると言う方法ですが,STL コンテナは継承される事を 想定して設計されていないため,ユーザの利用方法によっては問題が生じる事があります.

Container Wrapper は,STL の各コンテナクラスを安全に継承できる形にラップしたクラス群です. ユーザは,対象とする STL コンテナの代わりに対応する Container Wrapper クラスを継承する事により,各 STL コンテナで定義されているメソッド群を サブクラスでも利用することができるようになります.

Container Wrapper クラスは,ラップ元の STL コンテナへのキャスト演算子を定義しているので, (対応する)STL コンテナクラスを引数に指定する関数などにも渡す事が可能です.

Example

example_deque_wrapper.cpp

#include <iostream>
#include <string>
#include <deque>
#include "clx/container_wrapper.h"

/* ------------------------------------------------------------------------- */
//  exdeque
/* ------------------------------------------------------------------------- */
class exdeque : public clx::deque_wrapper<std::string> {
public:
    exdeque() : clx::deque_wrapper<std::string>() {}
    
    virtual ~exdeque() throw() {}
    
    void do_something() {
        member.push_back("Hello, world!");
        member.push_back("foo");
        member.push_back("hoge");
        member.push_back("Bye bye.");
    }
};

/* ------------------------------------------------------------------------- */
//  put_element
/* ------------------------------------------------------------------------- */
void put_element(const std::deque<std::string>& v) {
    std::cout << "size: " << v.size() << std::endl;
    std::cout << "--" << std::endl;
    for (size_t i = 0; i < v.size(); ++i) {
        std::cout << v[i] << std::endl;
    }
    std::cout << std::endl;
}

/* ------------------------------------------------------------------------- */
//  main
/* ------------------------------------------------------------------------- */
int main(int argc, char* argv[]) {
    exdeque v;
    
    v.do_something();
    put_element(v);
    
    v.push_back("new element");
    put_element(v);
    
    std::cout << std::endl;
    
    return 0;
}
Result
size: 4
--
Hello, world!
foo
hoge
Bye bye.

size: 5
--
Hello, world!
foo
hoge
Bye bye.
new element

ラップ元の STL コンテナのインスタンスは,member と言う変数名で保持しています. 継承したサブクラス内で,直接 STL コンテナを操作する必要がある場合は, member と記述することでアクセスする事ができます.

Template Parameters, Construction, and Member Functions

対応する STL コンテナ・クラスのメソッドを参照して下さい.

References

  1. C++ Reference
  2. Container Accessors - Life like a clown
  3. Container Wrappers - Life like a clown