C++17 (20), аллокаторы и контейнеры
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.01.20 09:06
Оценка:
В C++17 (может уже и в 14-ом) у аллокаторов часть интерфейса объявлена как deprecated.

В С++20 этот deprecated вырезали окончательно.

В частности речь идет про rebind.

У меня в коде есть "raw_memory" allocator. Который сам по себе возвращает void*.

Я его подсовывал в std::vector, std::list ..., они его ребиндили к нужному типу и все прекрасно работало.

При включении C++17 в VS2019, вылазит ошибка компиляции:

Ошибка C2338 vector<T, Allocator> requires that Allocator's value_type match T (See N4659 26.2.1 [container.requirements.general]/16 allocator_type) Either fix the allocator value_type or define _ENFORCE_MATCHING_ALLOCATORS=0 to suppress this diagnostic.


class vector { // varying size array of values
//.... вот эта проверка
    static_assert(!_ENFORCE_MATCHING_ALLOCATORS || is_same_v<_Ty, typename _Alloc::value_type>,
        _MISMATCHED_ALLOCATOR_MESSAGE("vector<T, Allocator>", "T"));


Смысла решать проблему через _ENFORCE_MATCHING_ALLOCATORS я не вижу.

Поэтому решал пересесть на свои костылики:

template<class T,class allocator>
using t_stl_vector
 =std::vector
   <T,
    typename allocator::template rebind<T>::other>;

template<class Key,class T,class Less,class allocator=t_void_allocator>
using t_stl_map
 =std::map
   <Key,
    T,
    Less,
    typename allocator::template rebind<std::pair<const Key,T>>::other>;


Все собралось и работает.

Вопрос — это что, если я хочу юзать свои распределяторы памяти, мне с этими костылями до конца жизни жить?

Раньше было лучше!
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.