I'm trying to implement my own allocator, which should work with STL containers and use a custom fancy pointer implementation.
I'm pretty sure, that my classes fulfill all requirements (according to cppreference) but my implementation doesn't compile for std::list because there is no conversion from my fancy pointer to a normal pointer.
A minimal example which shows the problem, (but is obviously not my real implementation):
fancy_ptr.h:
#include <cstddef> template<typename T> class FancyPtr { T *ptr; FancyPtr(T *ptr, bool) : ptr(ptr) {}; //Bool to be non standart public: using element_type = T; FancyPtr(std::nullptr_t n) : FancyPtr() {}; template<class S> operator FancyPtr<S>() { return {ptr}; } T &operator*() { return *ptr; } T &operator[](size_t n) { return ptr[n]; } T *operator->() { return ptr; } bool operator==(const FancyPtr &other) { return ptr == other.ptr; }; static FancyPtr pointer_to(element_type &r) { return FancyPtr(&r, false); }; }; TrivialAllocator.h:
#include "fancy_ptr.h" template<typename T> class TrivialAllocator { public: using pointer = FancyPtr<T>; using value_type = T; TrivialAllocator() = default; template<typename Other> TrivialAllocator(const TrivialAllocator<Other> &other) {}; template<typename Other> TrivialAllocator(TrivialAllocator<Other> &&other) {}; TrivialAllocator(TrivialAllocator &alloc) = default; pointer allocate(size_t n) { return pointer::pointer_to(*new T[n]); } void deallocate(pointer ptr, size_t n) { delete[] &*ptr; }; bool operator==(const TrivialAllocator &rhs) const { return true; }; bool operator!=(const TrivialAllocator &rhs) const { return false; }; }; main.cpp:
#include "TrivialAllocator.h" #include <list> int main() { struct Test {}; using AllocT = std::allocator_traits<TrivialAllocator<long double>>; static_assert(std::is_same_v<FancyPtr<long double>,std::pointer_traits<AllocT::pointer>::pointer>); static_assert(std::is_same_v<FancyPtr<Test>, std::pointer_traits<AllocT::pointer>::rebind<Test>>); std::list<long double, AllocT::allocator_type> list; } The static assertions are ok.
Can anybody tell me what I have to to to get this working?
PS: I know that operator-> is in something like a conversion operator, but the underlying problem is that std::list seem not to save my fancy pointers, but raw pointers.