Учитывая определения типа
using ConstHandle = MyEntity const*;
using Handle = MyEntity*;
можно проводить следующие преобразования типов:
Handle
→ ConstHandle
(Неявный)ConstHandle
→ Handle
(явно через const_cast
)Handle*
→ ConstHandle*
(явно через const_cast
)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? легальный особенно относится к подходам, которые делают не подразумевать нарушение строгое правило алиасинга.
Задача ещё не решена.
Других решений пока нет …