Добавление флага для одного векторного элемента c

#c #vector

#c #вектор

Вопрос:

Старая программа использует vector в качестве контейнера для самостоятельно определенного типа, например:

 std::vector<my_type> m_my_type_queue;
  

И он использует api vector, например:

 m_my_type_queue.size();
m_my_type_queue.begin();
  

Теперь я хотел бы расширить очередь дополнительным тегом, поэтому я вставил вектор вместе с тегом типа:

 struct my_type_queue {
  std::vector<my_type> m_vector;
  mutable bool tag;
}

my_type_queue m_my_type_queue;
  

Но проблема с этой реализацией заключается в том, что мне нужно получить доступ к очереди с дополнительным слоем, например:

 m_my_type_queue.m_vector.size();
m_my_type_queue.m_vector.begine();
  

Мой вопрос в том, как я могу получить доступ к элементу так же, как и раньше, но также могу получить доступ к тегу, что-то вроде:

 m_my_type_queue.size();      // the same as original implementation
m_my_type_queue.begin();     // the same as original implementation
m_my_type_queue.tag = true;  // new feacture with tag access
  

Я могу переопределить эти API для vector и перенаправить их в реальный вектор, но есть ли какой-нибудь простой способ сделать это?

Комментарии:

1. Примечание, почему бы не использовать a вместо создания структуры std::pair<bool, std::vector<my_type> > ? В зависимости от вашего использования это может более четко отображать намерение.

2. если вы выполняете много векторных операций в одном месте, почему бы просто не сохранить локальную ссылку на вектор структуры, а затем выполнить все операции с локальной ссылкой. Конечно, это не будет полезно, если вы в основном выполняете отдельные операции, разбросанные по всему вашему коду. Или, если вас действительно беспокоит ввод текста, вы можете добавить в структуру методы-оболочки, которые переносят все векторные функции, которые вы хотите использовать

Ответ №1:

Один из способов удовлетворить ваши потребности — сделать ваш my_type_queue производным от std::vector .

Но я бы рекомендовал другой способ: использовать вектор как есть и поддерживать отдельный флаг.

Комментарии:

1. Пожалуйста, не производите от std::vector . Стандарт рекомендует этого не делать.

2. Вы можете наследовать private ly и вернуть хотя бы часть std::vector интерфейса обратно с помощью using объявлений довольно легко.

3. @R Sahu Я согласен. Вот почему я сказал, что порекомендовал бы другой способ. Я предоставил это странное решение только потому, что это лучшее, что я мог придумать, чтобы напрямую обратиться к исходному (странному) запросу.