#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 Я согласен. Вот почему я сказал, что порекомендовал бы другой способ. Я предоставил это странное решение только потому, что это лучшее, что я мог придумать, чтобы напрямую обратиться к исходному (странному) запросу.