constexpr и преобразование указателей
От: Videoman Россия https://hts.tv/
Дата: 17.11.19 20:17
Оценка: 9 (1)
Приветствую всех С++ гуру. На днях столкнулся с очередной особенностью С++17, а именно: невозможность преобразовать указатели разных типов друг к другу в compile-time.
Мне в моей библиотеке необходим специальный класс Buffer, для работы с буферами данных разного типа, в котором хотелось бы иметь возможность работать с указателями во время компиляции, в том числе. Проблема:
// Вариант первый:
class Buffer
{
public:
    
    constexpr Buffer(void* data, size_t size) : m_data(data), m_size(size) {}

    constexpr Bufer& operator++(); // ??? 

//...
private:

    void* m_data;
    size_t m_size;
};

принимает любой указатель без необходимости явного преобразования, но после, непонятно как реализовать операцию инкремента, т.к. компилятор запрещает преобразования между указателями void* и, например, uint8_t* — для того чтобы можно было как-то сдвинуть указатель буфера.
// Вариант второй:
class Buffer
{
public:
    
    constexpr Buffer(uint8_t* data, size_t size) : m_data(data), m_size(size) {}

    constexpr Bufer& operator++() { m_data++; return *this; } // Нет проблем!!!

//...
private:

    uint8_t* m_data;
    size_t m_size;
};

работает, но теперь неудобно работать с классом, так как нужно явно кастировать указатели разных типов, в том числе и void*, к указателям на uint8_t*.

Класс Buffer является оберткой для "сырых" данных. Размер m_size для любых буферов указывается в байтах. Операция инкремент должна сдвигать буфер на один байт. Просьба помочь с дизайном и заодно советом, как реализовать операцию инкремент в compile-time для такого случая, или объяснить почему это не возможно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.