Предположим, у меня есть переменная-член std::vector<std::string>
в классе, и я хочу вернуть его из функции-члена как неизменяемое представление, используя комбинацию gsl::array_view
а также gsl::cstring_view
, К сожалению, следующее не компилируется:
class C {
public:
gsl::array_view<const gsl::cstring_view<>> getVectorOfStrings() const
{
return _vectorOfStrings;
}
private:
std::vector<std::string> _vectorOfStrings;
};
Причина этого заключается в том, что нет контейнера cstring_view
что array_view
может быть создан из. Итак, мой вопрос: есть ли способ использовать такую конструкцию, не добавляя явно что-то вроде члена типа std::vector<gsl::cstring_view<>>
что явно нежелательно?
редактировать
Мне кажется, что такие «трансформирующие» взгляды могут иметь более широкое применение. Рассмотреть возможность vector
владения указателями, такими как std::vector<std::shared_ptr<T>>
, который я хотел бы представить пользователю класса как array_view
сырых указателей: gsl::array_view<const T*>
без разоблачения моего подхода к реализации, определенного для хранения. Мысли?
По определению представления обычно предоставляют только ссылки на существующие объекты. В результате нет способа создать нормальный array_view<const cstring_view<>>
без предварительного создания соответствующего контейнера, например, vector<const cstring_view<>>
,
Однако вы могли бы создать свою собственную специализацию для gsl::array_view<const cstring_view<>>
, что создает cstring_view<>
по требованию (когда вызывается оператор индекса и когда разыменовывается итератор). Хотя это сэкономит вам динамическое распределение памяти и уменьшит объем занимаемой памяти по сравнению с наивным подходом, в большинстве случаев это не стоит дополнительной сложности.
Если вы хотите следовать обобщенному подходу, как описано в ваших изменениях, вы можете взглянуть на boost::transform_iterator
— либо для непосредственного использования, либо в качестве вдохновения для вашего собственного обобщенного transform_array_view
класс (который, я уверен, будет полезным дополнением к gsl или boost).
Других решений пока нет …