gsl :: array_view & lt; const gsl :: cstring_view & lt; & gt; & gt; из std :: vector & lt; std :: string & gt;

Предположим, у меня есть переменная-член 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*> без разоблачения моего подхода к реализации, определенного для хранения. Мысли?

2

Решение

По определению представления обычно предоставляют только ссылки на существующие объекты. В результате нет способа создать нормальный 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).

1

Другие решения

Других решений пока нет …