Перво-наперво: я не вижу никакого смысла делать это вообще. Теперь, если вы намереваетесь избежать синтаксиса ()[]
, на котором я настаиваю: я бы не стал, вы можете просто предложить ссылку на тип.
class test {
std::vector<int> m_data;
public:
std::vector<int> &data;
test() : m_data(), data( m_data ) {}
};
Преимущество перед упаковщиками заключается в том, что его проще кодировать, и с ним не так уж много проблем. Недостатком является то, что вы пропускаете детали своей реализации: внешний код будет зависеть от реализации вашего объекта в терминах std::vector
, для которого вы предлагаете ссылку. Обратите внимание, что с упаковщиком нет большой разницы в этом отношении, так как в обоих случаях вы предлагаете доступ к деталям ( Я предложу вам индексированный доступ к моим внутренним элементам ), которые могут быть или не быть хорошая идея.
Другие простые в коде, не очень хорошие решения могут подразумевать использование наследования, как в:
class test : private std::vector<int>
{
public:
using std::vector<int>::operator[];
};
Важной деталью здесь является то, что вы никогда не должны публично наследовать от контейнера STL (на самом деле, будучи class
, ключевое слово private
выше необязательно, так как наследование по умолчанию закрытый, но я добавил его для акцента), они не были предназначены для полиморфной работы. Используя частное наследование, вы ограничиваете риск ошибок пользователя, поскольку этот вектор является деталью реализации.
Если позднее вы решите изменить вектор для другого контейнера (который допускает индексированный доступ - опять же, вы обещаете индексированный доступ в интерфейсе!), Вам нужно только предоставить свои собственные реализации operator[]
и пользователя код будет скомпилирован без изменений.