Работа с указателями членов данных и изменчивыми полямиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Работа с указателями членов данных и изменчивыми полями

Сообщение Anonymous »

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

Код: Выделить всё

struct ContainerStatus {};

struct ContainerItem
{
mutable ContainerStatus status;
};

template 
class Container
{
public:
Container(ContainerStatus T::*statusField)
: m_statusField(statusField) { }

void push_back(T* ptr)
{
// Allocate and move the pointer...
// Update the status of the pointed item
// T may be const as part of a Container
}

private:
ContainerStatus T::*m_statusField;
};

ContainerItem item;
Container container;
container.push_back(&item);
Однако, когда дело доходит до обновления статуса, поскольку указатель члена данных считает, что поле не является изменчивым и может быть изменено только на неконфессиональных элементах, я вынужден const_cast элемент или статус для обновления статуса в контексте Constexts.
ptr->*status = ...; // Error if T is const

const_cast(ptr)->*status = ...;
// OR
const_cast(ptr->*status) = ...;
< /code>
Это не кажется очень элегантным и технически не является постоянным корректом, если не гарантированно поле не будет изменчивым, для которого нет никакой защиты времени компиляции. Следовательно, мне было интересно, есть ли какой -нибудь способ аннотировать указатель члена данных, чтобы указать, что он должен указывать на изменчивое поле.

Подробнее здесь: https://stackoverflow.com/questions/795 ... ble-fields
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»