Существует ли стандартное решение C++11, обеспечивающее аналогичную гибкость? В настоящее время я предпочитаю использовать старый добрый void* plus size.
Не существует стандартного решения C++11, которое предоставляет контейнер, который может управлять как собственной памятью, так и оборачивать память, управляемую кем-то другим.
Вы можете просто скопировать QByteArray
(это несколько файлов) и связать их с вашим проектом, если позволяют условия лицензии.
В противном случае, если вы собираетесь работать только с контейнерами с непрерывным хранилищем для всех элементов, аргументы const void*
и size_t
имеют смысл и будут наиболее переносимыми и адаптируемыми. При необходимости вы можете предоставить удобные перегрузки. Например.
HashType calculateHash(const void*, size_t);
template <typename T> HashType calculateHash(const T& container) {
static_assert(sizeof(typename T::value_type) == 1, "value_type must be byte-sized");
assert(&container[container.size()-1] == &container[0]+container.size());
return calculateHash(&container[0], container.size());
}
Для поддержки любого контейнера, даже с несмежным хранилищем, база calculateHash
может принимать диапазон и предлагать перегрузку для хеширования всего контейнера.
template <typename I>
HashType calculateHash(I start, I const end) {
HashType hash;
for (; start != end; ++start)
hash.update(*start);
return hash;
}
template <typename C>
HashType calculateHash(const C& container) {
using std::begin;
using std::end;
return calculateHash(begin(container), end(container));
}
person
Kuba hasn't forgotten Monica
schedule
23.11.2016
vector<unsigned char>
из указателя и размера (или, может быть, строки C) без глубокого копирования? - person Silicomancer   schedule 24.11.2016myVector.assign(pointer, pointer + size)
может быть? Также существует около 7 различных конструкторов. - person   schedule 24.11.2016ptr, ptr+size
в качестве диапазона очень распространена. Чтобы быть более прямым, нет ничего даже отдаленно близкого к широте функциональных возможностей, которые предлагает QByteArray. Большая часть этого потребует от вас реализации поведения. - person WhozCraig   schedule 24.11.2016std::vector<uint8_t>
мне кажется очевидной заменойQByteArray
, если вам просто нужен контейнер, который может хранить произвольные двоичные данные. - person Jesper Juhl   schedule 24.11.2016std::array_view
, и в данном случае это сработает. Прямо сейчас я думаю, что вы можете получить его как часть основной библиотеки руководств. - person NathanOliver   schedule 24.11.2016