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;
}
}