C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 59 を表示中)
■33846 / )  Re[12]: クラスの継承とイテレータ
□投稿者/ επιστημη (1817回)-(2009/03/11(Wed) 10:36:03)
επιστημη さんの Web サイト
2009/03/11(Wed) 10:36:26 編集(投稿者)
> Data<std::vector<int>>と Data<std::list<int>>のポインタを
> vector< Data??? * > 等で管理したい場合でした。

↓こんな雰囲気かのぉ...

#include <iostream>

#include <vector>
#include <list>
#include <iostream>
#include <numeric>
#include <algorithm>

template<typename T>
class AbstractData {
public:
  virtual int size() const = 0;
  virtual T* copy_to(T* out) const =0;
};

template<typename T,  template <typename U, class A=std::allocator<U> > class Container>
class Data : public AbstractData<T> {
  typedef typename Container<T> container;
  container data_;
public:
  typedef typename container::iterator iterator;
  typedef typename container::const_iterator const_iterator;
  typedef typename container::value_type value_type;
  iterator begin() { return data_.begin(); }
  const_iterator begin() const { return data_.begin(); }
  iterator end() { return data_.end(); }
  const_iterator end() const { return data_.end(); }
  void push_back(const value_type& x) { data_.push_back(x); }
  
  virtual int size() const { return data_.size(); }
  virtual T* copy_to(T* out) const { return std::copy(begin(), end(), out); }
};

int main() {
    std::vector<AbstractData<int>*> vad;
    
    Data<int,std::vector> vdata;
    vdata.push_back(1);
    vdata.push_back(2);
    vdata.push_back(3);
    vad.push_back(&vdata);

    Data<int,std::list>   ldata;
    ldata.push_back(4);
    ldata.push_back(5);
    ldata.push_back(6);
    ldata.push_back(7);
    vad.push_back(&ldata);
    
    for ( int i = 0; i < vad.size(); ++i ) {
      AbstractData<int>* pdata = vad.at(i);
      int n = pdata->size();
      int* first = new int[n];
      int* last = pdata->copy_to(first);
      int sum = std::accumulate(first, last, 0);
      std::cout << "sum-" << i << '\t' << sum << std::endl;
      delete[] first;
    }
}

返信 編集キー/


管理者用

- Child Tree -