Приветствую всех С++ гуру. На днях столкнулся с очередной особенностью С++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 для такого случая, или объяснить почему это не возможно.