Ответ 1
Есть два способа сделать это в зависимости от того, что у вас есть на данный момент.
Если у вас есть выражение lvalue, скажите поле значения в node, вы можете использовать std:: addressof следующим образом:
allocator_traits<allocator_type>::construct(alloc, std::addressof(ptr->value), ...);
где ptr
является allocator_type::pointer
.
Однако, если у вас нет поля для разыменования и вы хотите преобразовать allocator_type::pointer
в T*
, вам нужно сначала выполнить трюк:
template <class T>
inline
T*
to_raw_pointer(T* p) noexcept
{
return p;
}
template <class Pointer>
inline
typename std::pointer_traits<Pointer>::element_type*
to_raw_pointer(Pointer p) noexcept
{
return p != nullptr ? ::to_raw_pointer(p.operator->())
: nullptr;
}
И теперь вы можете сказать:
allocator_traits<allocator_type>::construct(alloc, to_raw_pointer(ptr), ...);