Сообщение Re[3]: constexpr и преобразование указателей от 18.11.2019 11:52
Изменено 18.11.2019 11:58 rg45
Re[3]: constexpr и преобразование указателей
Здравствуйте, Videoman, Вы писали:
V>Ну, собственно, так и было сделано до constexpr. m_data был void*, но как только к конструктору или оператору добавляется constexpr, компилятор тут же начинает ругаться что static_cast<uint8_t*>(m_data) — не разрешен во времени компиляции. В этом и вопрос, а как "двигать" указатель без каста тогда?
И вот так работает :
http://coliru.stacked-crooked.com/a/44e5fb34c52e09c0
Можем считать, что, методом научного тыка, решение найдено?
V>Ну, собственно, так и было сделано до constexpr. m_data был void*, но как только к конструктору или оператору добавляется constexpr, компилятор тут же начинает ругаться что static_cast<uint8_t*>(m_data) — не разрешен во времени компиляции. В этом и вопрос, а как "двигать" указатель без каста тогда?
И вот так работает :
http://coliru.stacked-crooked.com/a/44e5fb34c52e09c0
class Buffer
{
public:
template <typename T>
constexpr Buffer(const T& data) : Buffer(&data, sizeof(data)) {}
constexpr Buffer(const void* data, size_t size) : m_data(static_cast<uint8_t*>(const_cast<void*>(data))), m_size(size) {}
constexpr Buffer& operator++() { m_data++; return *this; } // Нет проблем!!!
constexpr size_t size() const { return m_size; }
//...
private:
uint8_t* m_data;
size_t m_size;
};
int main() {
static_assert(Buffer("Hello, World!").size() == 14, "");
}
Можем считать, что, методом научного тыка, решение найдено?
Re[3]: constexpr и преобразование указателей
Здравствуйте, Videoman, Вы писали:
V>Ну, собственно, так и было сделано до constexpr. m_data был void*, но как только к конструктору или оператору добавляется constexpr, компилятор тут же начинает ругаться что static_cast<uint8_t*>(m_data) — не разрешен во времени компиляции. В этом и вопрос, а как "двигать" указатель без каста тогда?
И вот так тоже работает :
http://coliru.stacked-crooked.com/a/23431aeebb4072fd
Можем считать, что, методом научного тыка, решение найдено?
V>Ну, собственно, так и было сделано до constexpr. m_data был void*, но как только к конструктору или оператору добавляется constexpr, компилятор тут же начинает ругаться что static_cast<uint8_t*>(m_data) — не разрешен во времени компиляции. В этом и вопрос, а как "двигать" указатель без каста тогда?
И вот так тоже работает :
http://coliru.stacked-crooked.com/a/23431aeebb4072fd
class Buffer
{
public:
template <typename T>
constexpr Buffer(const T& data) : Buffer(&data, sizeof(data)) {}
constexpr Buffer(const void* data, size_t size) : m_data(bytes(data)), m_size(size) {}
constexpr Buffer& operator++() { m_data++; return *this; } // Нет проблем!!!
constexpr size_t size() const { return m_size; }
//...
private:
static constexpr uint8_t* bytes(const void* data) { return static_cast<uint8_t*>(const_cast<void*>(data)); }
uint8_t* m_data;
size_t m_size;
};
Можем считать, что, методом научного тыка, решение найдено?