Для чего можно использовать std:: remove extent?
Я изучаю новые функции, предоставляемые C++11, и я нашел std:: remove_extent.
typedef std::remove_extent<int[24]>::type A; // A is int
однако я не могу найти для этого использования, кроме определения нового типа из существующего типа путем удаления измерения из данного типа.
может ли кто-нибудь предположить, почему C++11 представил эту функцию? Есть ли какие-либо преимущества?
2 ответов
есть хороший пример использования std::remove_extent
в самом стандарте C++.
функция шаблона, которая создает объект smart pointer std::unique_ptr
template <class T> unique_ptr<T> make_unique(size_t n);
возвращает следующее выражение (20.8.1.4 unique_ptr creation p.#4)
unique_ptr<T>(new remove_extent_t<T>[n]())
рассмотрим, например, декларация
auto p2 = std::make_unique<int[][10]>(2);
в этом случае make_unique необходимо удалить размер, указанный как []
в объявлении типа int[][10]
и заменить на [2]
получаете int[2][10]
в новом выражении.
когда вы работаете с массивами, вам может потребоваться получить общее количество элементов массива, включая суб-массивы. Это можно сделать с помощью некоторого метапрограммирования шаблонов, используя std::extent
и std::rank
вместе с std::remove_extent
.
template <class T, std::size_t N = std::extent<T>::value >
struct total_elements
{
using M_type = typename std::remove_extent<T>::type;
static constexpr std::size_t value = N * total_elements< M_type >::value;
};
template <class T>
struct total_elements<T, 0> : std::integral_constant<std::size_t, 1> {};
видео.
это может быть особенно полезно, если вы работаете с vector
of vectors
потому что хранение не гарантировано, чтобы быть непрерывным: давая общее количество элементов и 1D vector
, вы получите это. Вам также понадобится некоторая арифметика указателя, чтобы она вела себя как многомерная, но это легко абстрагировать в классе.
как Примечание, стандарт не обязывает вас использовать его: если вы найдете место, где он может быть полезен, то идите за ним.