2010/05/17(Mon) 17:02:37 編集(投稿者)
const reference が nonconst だったのを編集
自作 allocator を作っても list に対して実用できないわけだし、
正直なぜこんな難度の割りに益が少ないところをコネコネしようとしているのかよくわからないが・・・
# もっと簡単かつ利の多いところがありそうな気がする
とりあえずウチの gcc-4.3.3 & VS2005 の両方でコンパイルできるソースを提示しておく。解説略。
解説するとしたら厳密な話がお望み?それとも「こんなもん」というレベルの話をお望み?
#include <iostream>
#include <vector>
#include <cstdlib>
#define ALLOCATE_OUTSIDE_CLASS 0
template<typename T>struct myallocator;
template<> struct myallocator<void> {
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename U> struct rebind {typedef myallocator<U> other; };
};
template<typename T> struct myallocator {
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
template<typename U> struct rebind { typedef myallocator<U> other; };
myallocator() throw() {}
myallocator(const myallocator&) throw() {}
template<typename U> myallocator(const myallocator<U>&) throw() {}
size_type max_size() const throw() { return -1; }
void destroy(T* p) { p->~T(); }
pointer address(reference x) const { return &x; }
#if ALLOCATE_OUTSIDE_CLASS
pointer allocate(size_type n, myallocator<void>::const_pointer hint=0);
#else
pointer allocate(size_type n, myallocator<void>::const_pointer hint=0) {
std::cout << "myallocator::allocate(" << n << "," << static_cast<const void*>(hint) << ")";
void* p=malloc(n*sizeof(T));
std::cout << " returning p=" << p << std::endl;
return reinterpret_cast<pointer>(p);
}
#endif
void deallocate(pointer p, size_type n) {
std::cout << "myallocator::deallocate(" << static_cast<void*>(p) << "," << n << ")\n";
free(p);
}
void construct(pointer p, const T& value) {
std::cout << "myallocator::construct(" << static_cast<void*>(p) << "," << value << ")\n";
*p=value;
}
};
#if ALLOCATE_OUTSIDE_CLASS
template<typename T>
T* myallocator<T>::allocate(typename myallocator<T>::size_type n, typename myallocator<void>::const_pointer hint) {
std::cout << "myallocator::allocate(" << n << "," << static_cast<const void*>(hint) << ")";
void* p=malloc(n*sizeof(T));
std::cout << " returning p=" << p << std::endl;
return reinterpret_cast<typename myallocator<T>::pointer>(p);
}
#endif
int main() {
std::vector<int, myallocator<int> > l;
l.reserve(100);
l.push_back(999);
l.push_back(998);
}