Как обрабатывать неявные и явные преобразования типов между константными и неконстантными причудливыми указателями?

Учитывая определения типа

using ConstHandle = MyEntity const*;
using Handle = MyEntity*;

можно проводить следующие преобразования типов:

  1. HandleConstHandle (Неявный)
  2. ConstHandleHandle (явно через const_cast)
  3. Handle*ConstHandle* (явно через const_cast)
  4. ConstHandle&Handle& (явно через const_cast)

Можно ли добиться аналогичного поведения с помощью маркеров, основанных на идентификаторах вместо указателей?

Случаи 1 и 2 могут быть легко решены, например,

struct ConstHandle
{
int id;
};

struct Handle
{
operator ConstHandle() const { return { id }; }
int id;
};

Handle const_handle_cast(ConstHandle h) { return { h.id }; }

Случай 3 может почти быть решена путем вывода Handle от ConstHandleт.е.

struct ConstHandle
{
int id;
};

struct Handle : ConstHandle
{
};

Вот, почти относится к тому, что, теперь, преобразование Handle*ConstHandle* неявное, а явное.

Есть ли правовой Решение, которое включает в себя случай 4? легальный особенно относится к подходам, которые делают не подразумевать нарушение строгое правило алиасинга.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]